Python 信号处理程序在程序退出之前不会终止进程

问题描述 投票:0回答:1

我想通过使用信号处理程序顺利终止我的 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)
python subprocess signals
1个回答
0
投票

这些信号被传递到进程组。 所以父母和孩子都会得到它们。 我们有机会让父母服从他们而孩子忽视他们。

与其直接分叉

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')
© www.soinside.com 2019 - 2024. All rights reserved.