2015-09-12 01:57:22 +03:00
|
|
|
#!/usr/bin/env python
|
|
|
|
"""Print received signals to stdout.
|
|
|
|
|
|
|
|
Since all signals are printed and otherwise ignored, you'll need to send
|
|
|
|
SIGKILL (kill -9) to this process to actually end it.
|
|
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
|
2015-09-17 05:42:09 +03:00
|
|
|
import os
|
2015-09-12 01:57:22 +03:00
|
|
|
import signal
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
|
2015-09-26 04:18:40 +03:00
|
|
|
|
|
|
|
CATCHABLE_SIGNALS = frozenset(
|
2019-07-15 20:44:20 +03:00
|
|
|
set(range(1, 32)) - {signal.SIGKILL, signal.SIGSTOP, signal.SIGCHLD},
|
2015-09-26 04:18:40 +03:00
|
|
|
)
|
2015-09-12 01:57:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
print_queue = []
|
2015-09-26 04:18:40 +03:00
|
|
|
last_signal = None
|
2015-09-12 01:57:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
def unbuffered_print(line):
|
2019-02-21 00:00:02 +03:00
|
|
|
sys.stdout.write('{}\n'.format(line))
|
2015-09-12 01:57:22 +03:00
|
|
|
sys.stdout.flush()
|
|
|
|
|
|
|
|
|
|
|
|
def print_signal(signum, _):
|
|
|
|
print_queue.append(signum)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
for signum in CATCHABLE_SIGNALS:
|
|
|
|
signal.signal(signum, print_signal)
|
|
|
|
|
2019-02-21 00:00:02 +03:00
|
|
|
unbuffered_print('ready (pid: {})'.format(os.getpid()))
|
2015-09-12 01:57:22 +03:00
|
|
|
|
|
|
|
# loop forever just printing signals
|
|
|
|
while True:
|
|
|
|
if print_queue:
|
2015-09-26 04:18:40 +03:00
|
|
|
signum = print_queue.pop()
|
|
|
|
unbuffered_print(signum)
|
|
|
|
|
|
|
|
if signum == signal.SIGINT and last_signal == signal.SIGINT:
|
|
|
|
print('Received SIGINT twice, exiting.')
|
|
|
|
exit(0)
|
|
|
|
last_signal = signum
|
2015-09-12 01:57:22 +03:00
|
|
|
|
|
|
|
time.sleep(0.01)
|