dumb-init/testing/print_signals.py

51 lines
1.1 KiB
Python
Raw Normal View History

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
import os
2015-09-12 01:57:22 +03:00
import signal
import sys
import time
CATCHABLE_SIGNALS = frozenset(
2019-02-21 00:00:02 +03:00
set(range(1, 32)) - {signal.SIGKILL, signal.SIGSTOP, signal.SIGCHLD}
)
2015-09-12 01:57:22 +03:00
print_queue = []
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:
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)