dumb-init/testing/print_signals.py
2019-07-15 13:23:51 -07:00

51 lines
1.1 KiB
Python
Executable file

#!/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
import signal
import sys
import time
CATCHABLE_SIGNALS = frozenset(
set(range(1, 32)) - {signal.SIGKILL, signal.SIGSTOP, signal.SIGCHLD},
)
print_queue = []
last_signal = None
def unbuffered_print(line):
sys.stdout.write('{}\n'.format(line))
sys.stdout.flush()
def print_signal(signum, _):
print_queue.append(signum)
if __name__ == '__main__':
for signum in CATCHABLE_SIGNALS:
signal.signal(signum, print_signal)
unbuffered_print('ready (pid: {})'.format(os.getpid()))
# 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
time.sleep(0.01)