| ############################################################################ |
| # Copyright (C) SchedMD LLC. |
| ############################################################################ |
| import time |
| import sys |
| |
| BILLION = 1_000_000_000 |
| |
| |
| def main(): |
| """Print time every second and report detected process suspensions. |
| |
| Prints every second some information for 'start' number of seconds. Takes in |
| an optional integer terminal argument for the value of 'start' -- defaults |
| to 30 if no such argument is given. |
| |
| Additionally, this method attempts to determine if it has been suspended |
| and, upon determination, prints 'JobSuspended' once the process is resumed. |
| Because programs can't catch suspension signals like 'SIGSTOP', this method |
| instead determines it was suspended if it hasn't updated the variable 'last' |
| in the last 3 seconds. Note that all time measurements are performed in |
| nanoseconds. |
| """ |
| |
| if len(sys.argv) > 1: |
| start = int(sys.argv[1]) |
| else: |
| start = 30 |
| |
| last = time.monotonic_ns() |
| for i in range(start, 0, -1): |
| print(f"{i:02d} {last}") |
| sys.stdout.flush() |
| time.sleep(1) |
| now = time.monotonic_ns() |
| if now > (last + 3 * BILLION): |
| print("JobSuspended") |
| last = now |
| |
| print("AllDone") |
| |
| |
| if __name__ == "__main__": |
| main() |