Stefan Scherfke avatar Stefan Scherfke committed 79cefe5

Added tests for sigint, sigterm and sigkill for linux.

Comments (0)

Files changed (3)

+"""
+A SIGINT is not forwarded to child processes if you send it into a
+subprocess.
+
+Works on:
+
+- Linux
+- OS X
+- Windows?
+
+"""
+import signal
+import subprocess
+import sys
+import time
+
+
+def parent():
+    proc = subprocess.Popen(['python', 'sigint.py', 'child'])
+    try:
+        time.sleep(60)
+    except KeyboardInterrupt:
+        # Uncomment this line to see that SIGINT is not forwarded
+        # automatically.
+        proc.send_signal(signal.SIGINT)
+        print('parent waiting for child')
+        proc.wait()
+        print('parent terminating')
+
+
+def child():
+    try:
+        time.sleep(60)
+    except KeyboardInterrupt:
+        print('child terminating')
+
+
+if __name__ == '__main__':
+    if len(sys.argv) == 1:
+        proc = subprocess.Popen(['python', 'sigint.py', 'parent'])
+        time.sleep(1)
+        print('Sending SIGINT to parent')
+        proc.send_signal(signal.SIGINT)
+        print('Waiting for parent')
+        proc.wait()
+    elif sys.argv[1] == 'parent':
+        parent()
+    elif sys.argv[1] == 'child':
+        child()
+"""
+SIGKILL cannot be caught and there is no way to forward it to child
+processes.
+
+On Linux, ``proc.send_signal(signal.SIGKILL)`` is equivalent to
+``proc.kill()``. On Windows, ``proc.kill()`` will send a ``SIGTERM``.
+
+Works on:
+
+- Linux
+- OS X
+
+"""
+import signal
+import subprocess
+import sys
+import time
+
+
+def parent():
+    proc = subprocess.Popen(['python', 'sigkill.py', 'child'])
+    time.sleep(5)
+    proc.wait()
+    print('Parent was not killed.')
+
+
+def child():
+    time.sleep(5)
+    print('Child was not killed.')
+
+
+if __name__ == '__main__':
+    if len(sys.argv) == 1:
+        proc = subprocess.Popen(['python', 'sigkill.py', 'parent'])
+        time.sleep(1)
+        print('Sending SIGKILL to parent')
+        proc.send_signal(signal.SIGKILL)
+        print('Waiting for parent')
+        proc.wait()
+    elif sys.argv[1] == 'parent':
+        parent()
+    elif sys.argv[1] == 'child':
+        child()
+"""
+A SIGTERM is not forwarded to child processes if you send it into a
+subprocess.
+
+``proc.send_signal(signal.SIGTERM)`` is equivalent to ``proc.terminate()``.
+
+Works on:
+
+- Linux
+- OS X
+- Windows?
+
+"""
+import signal
+import subprocess
+import sys
+import time
+
+
+def parent():
+    proc = subprocess.Popen(['python', 'sigterm.py', 'child'])
+
+    def handler(signum, frame):
+        # Uncomment these lines to see that "sig" is not forwarded
+        # automatically.
+        print('parent received SIGTERM')
+        proc.send_signal(signal.SIGTERM)
+        # proc.terminate()
+
+        print('parent waiting for child')
+        proc.wait()
+        print('parent terminating')
+        sys.exit(0)
+
+    signal.signal(signal.SIGTERM, handler)
+    time.sleep(60)
+
+
+def child():
+    def handler(signum, frame):
+        print('child terminating')
+        sys.exit(0)
+
+    signal.signal(signal.SIGTERM, handler)
+    time.sleep(60)
+
+
+if __name__ == '__main__':
+    if len(sys.argv) == 1:
+        proc = subprocess.Popen(['python', 'sigterm.py', 'parent'])
+        time.sleep(1)
+        print('Sending SIGTERM to parent')
+        proc.send_signal(signal.SIGTERM)
+        # proc.terminate()
+        print('Waiting for parent')
+        proc.wait()
+    elif sys.argv[1] == 'parent':
+        parent()
+    elif sys.argv[1] == 'child':
+        child()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.