我想通过使用信号处理程序顺利终止我的 python 脚本。但是,如果发生键盘中断,则处理程序不会在程序退出之前完成。
关于如何让处理程序执行终止有任何提示吗?
import sys,subprocess,signal
def signal_handler(sig, frame):
zipProc.terminate()
zipProc.wait()
sys.exit('Stopped')
test_dir = '/mnt/Z/testdir'
out_file = '/mnt/Z/testdir.7z'
cmd = ['7z', 'a', '-t7z', out_file, test_dir]
zipProc = subprocess.Popen(cmd)
zipProc.communicate()
for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGQUIT, signal.SIGHUP]:
signal.signal(sig, signal_handler)
这些信号被传递到进程组。 所以父母和孩子都会得到它们。 我们有机会让父母服从他们而孩子忽视他们。
与其直接分叉
7z
,不如分叉这个7z.sh
脚本:
#! /usr/bin/env bash
trap '' SIGTERM SIGINT SIGQUIT SIGHUP # ignore signals
echo "$@"
exec "$@"
在看到
echo
调试正常工作后,将其删除。
父级应该在分叉工人之前安装处理程序:
for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGQUIT, signal.SIGHUP]:
signal.signal(sig, signal_handler)
cmd = ['./7z.sh', '7z', 'a', '-t7z', out_file, test_dir]
zipProc = subprocess.Popen(cmd)
zipProc.communicate()
在调试过程中让处理程序变得更健谈也没什么坏处。
def signal_handler(sig, frame):
print(f'Handling {sig}...')
zipProc.terminate()
print('Waiting...')
zipProc.wait()
sys.exit('Stopped')