我有一个主类,它生成一些子进程,这些子进程是multiprocessing.Process的子类,然后进入一个无限循环,直到进程被信号打断。
它是从一个__main__.py文件启动的,如下所示:
from module a import A
import signal
a = A()
def graceful_exit(signal=None, frame=None):
a.stop()
signal.signal(signal.SIGTERM, graceful_exit)
try:
write_pidfile(pid)
a.start()
finally:
我想通过向进程组中的进程发送SIGTERM来终止它。这可以通过kill命令来完成,但是我找到的手册很少提供关于它的确切工作原理的细节:
int kill(pid_t pid, int sig);
...
If pid is less than -1, then sig is sent to every process in
the process group whose ID is -pid.
但是,信号将以什么顺序发送到组成组的进程?想象一下这样的场景:在组中的主进程和从进程之间设置了管道。如果从进程在处理kill(-pid)期间被终止,而主进程仍未终止,则主进程
当子进程从终端接收到SIGINT时,我正在体验来自system()的一些奇怪的返回值。为了解释,在Perl脚本parent.pl中,我使用system()作为子进程运行另一个Perl脚本,但我也需要通过shell运行子程序,所以我使用了system 'sh', '-c', ...表单。因此,子进程的父进程变成了sh进程,sh进程的父进程变成了parent.pl。另外,为了避免sh进程接收SIGINT信号,我捕获了它。
例如,parent.pl
use feature qw(say);
use strict;
use warnings;
for (1..3) {
如果我使用杀死发送信号,它似乎要等到当前程序(在本例中是sleep 1000)完成运行。但是,当我通过在shell中按Ctrl+C发送SIGINT时,它会立即接收中断。
然而,我想要的是在通过kill发送信号后立即接收中断。另外,为什么当我按Ctrl+C时,它的行为会像我希望的那样
#!/usr/bin/env sh
int_after_a_while() {
local pid=$1
sleep 2
echo "Attempting to kill $pid with SIGINT"
# Here I want to kill the proc