Add notifications for SIGTERM and SIGINT.
David Blume

David Blume commited on 2019-08-26 22:23:39
Showing 4 changed files, with 52 additions and 9 deletions.

... ...
@@ -11,10 +11,16 @@ import subprocess
11 11
 import time
12 12
 from argparse import ArgumentParser
13 13
 import threading
14
-import queue
14
+import signal
15 15
 
16 16
 printer_lock = threading.Lock()
17 17
 
18
+def log_exit(_signal, frame):
19
+    log(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
20
+        f' PID={os.getpid()} signal={signal.Signals(_signal).name} Exiting.')
21
+    sys.exit(0)
22
+
23
+
18 24
 def pinger(host, delay):
19 25
     """Independent worker thread: repeatedly ping, check, print and sleep."""
20 26
     last_results = None
... ...
@@ -43,7 +49,7 @@ def log(*args, **kwargs):
43 49
 
44 50
 if __name__ == '__main__':
45 51
     parser = ArgumentParser(description="Repeatedly ping sites. Ex: %(prog)s -d 3 192.168.1.1 192.168.1.12")
46
-    parser.add_argument('-d', '--delay', type=float, default=1.0, help='Delay between pings')
52
+    parser.add_argument('-d', '--delay', type=float, default=3.0, help='Delay between pings')
47 53
     parser.add_argument('addresses', nargs='+', help='Addresses to ping')
48 54
     parser_args = parser.parse_args()
49 55
 
... ...
@@ -56,7 +62,10 @@ if __name__ == '__main__':
56 62
         _ping_cmd = ('ping', '-c', '1', '-W', '2', '-q')
57 63
 
58 64
     log(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
59
-        f' PID={os.getpid()} repeat={parser_args.delay}s Starting')
65
+        f' PID={os.getpid()} repeat={parser_args.delay}s addresses={",".join(parser_args.addresses)} Starting')
66
+
67
+    signal.signal(signal.SIGINT, log_exit)
68
+    signal.signal(signal.SIGTERM, log_exit)
60 69
 
61 70
     # Create worker threads for all but one host address. (Saving one address for this thread.)
62 71
     for address in parser_args.addresses[:-1]:
... ...
@@ -12,6 +12,14 @@ import time
12 12
 from argparse import ArgumentParser
13 13
 import threading
14 14
 import queue
15
+import signal
16
+
17
+
18
+def log_exit(_signal, frame):
19
+    _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
20
+                      f' PID={os.getpid()} signal={signal.Signals(_signal).name} Exiting.'])
21
+    _print_queue.join()
22
+    sys.exit(0)
15 23
 
16 24
 
17 25
 def pinger(host, delay):
... ...
@@ -50,7 +58,7 @@ def log(*args, **kwargs):
50 58
 
51 59
 if __name__ == '__main__':
52 60
     parser = ArgumentParser(description="Repeatedly ping sites. Ex: %(prog)s -d 3 192.168.1.1 192.168.1.12")
53
-    parser.add_argument('-d', '--delay', type=float, default=1.0, help='Delay between pings')
61
+    parser.add_argument('-d', '--delay', type=float, default=3.0, help='Delay between pings')
54 62
     parser.add_argument('addresses', nargs='+', help='Addresses to ping')
55 63
     parser_args = parser.parse_args()
56 64
 
... ...
@@ -66,8 +74,11 @@ if __name__ == '__main__':
66 74
     print_thread = threading.Thread(target=print_manager, daemon=True)
67 75
     print_thread.start()
68 76
 
69
-    _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
70
-                      f' PID={os.getpid()} repeat={parser_args.delay}s Starting'])
77
+    _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} PID={os.getpid()}'
78
+        f' repeat={parser_args.delay}s addresses={",".join(parser_args.addresses)} Starting'])
79
+
80
+    signal.signal(signal.SIGINT, log_exit)
81
+    signal.signal(signal.SIGTERM, log_exit)
71 82
 
72 83
     # Create worker threads for all but one host address. (Saving one address for this thread.)
73 84
     for address in parser_args.addresses[:-1]:
... ...
@@ -12,10 +12,18 @@ import time
12 12
 from argparse import ArgumentParser
13 13
 import threading
14 14
 import queue
15
+import signal
15 16
 
16 17
 pinger_lock = threading.Lock()
17 18
 
18 19
 
20
+def log_exit(signal_, frame):
21
+    _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
22
+                      f' PID={os.getpid()} signal={signal.Signals(signal_).name} Exiting.'])
23
+    _print_queue.join()
24
+    sys.exit(0)
25
+
26
+
19 27
 def pinger():
20 28
     """Each queue item is a new address to ping. Ping and compare and print.
21 29
     Issue: Each of these threads reads from and writes to the global _results dict.
... ...
@@ -89,7 +97,11 @@ if __name__ == '__main__':
89 97
     del t
90 98
 
91 99
     _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
92
-                      f' PID={os.getpid()} repeat={delay}s Starting'])
100
+        f' PID={os.getpid()} repeat={delay}s addresses={",".join(parser_args.addresses)} Starting'])
101
+
102
+    signal.signal(signal.SIGINT, log_exit)
103
+    signal.signal(signal.SIGTERM, log_exit)
104
+
93 105
     while True:
94 106
         for address in _results.keys():
95 107
             _ping_queue.put(address)
... ...
@@ -12,10 +12,18 @@ import time
12 12
 from argparse import ArgumentParser
13 13
 import threading
14 14
 import queue
15
+import signal
15 16
 
16 17
 pinger_lock = threading.Lock()
17 18
 
18 19
 
20
+def log_exit(_signal, frame):
21
+    _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
22
+                      f' PID={os.getpid()} signal={signal.Signals(_signal).name} Exiting.'])
23
+    _print_queue.join()
24
+    sys.exit(0)
25
+
26
+
19 27
 def pinger(host):
20 28
     """Executes one ping, prints if there was a change, exits thread."""
21 29
     now = time.localtime()
... ...
@@ -53,7 +61,7 @@ def log(*args, **kwargs):
53 61
 
54 62
 if __name__ == '__main__':
55 63
     parser = ArgumentParser(description="Repeatedly ping sites. Ex: %(prog)s -d 3 192.168.1.1 192.168.1.12")
56
-    parser.add_argument('-d', '--delay', type=float, default=1.0, help='Delay between pings')
64
+    parser.add_argument('-d', '--delay', type=float, default=3.0, help='Delay between pings')
57 65
     parser.add_argument('addresses', nargs='+', help='Addresses to ping')
58 66
     parser_args = parser.parse_args()
59 67
 
... ...
@@ -74,8 +82,11 @@ if __name__ == '__main__':
74 82
     t.start()
75 83
     del t
76 84
 
85
+    signal.signal(signal.SIGINT, log_exit)
86
+    signal.signal(signal.SIGTERM, log_exit)
87
+
77 88
     _print_queue.put([f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}'
78
-                      f' PID={os.getpid()} repeat={delay}s Starting'])
89
+        f' PID={os.getpid()} repeat={delay}s addresses={",".join(parser_args.addresses)} Starting'])
79 90
     while True:
80 91
         for address in _results.keys():
81 92
             t = threading.Thread(target=pinger, args=(address,), daemon=True)
82 93