这是进程组:( ps -ejH
)
xxxx xxxx xxxx ? 00:00:00 sshd
yyyy yyyy yyyy ? 00:00:00 sshd
8713 8713 8713 pts/0 00:00:00 bash
1234 1234 1234 ? 00:00:00 Process 1
5678 1234 1234 ? 00:00:00 openvt
3789 3789 3789 tty4 00:00:00 Python process
进程的状态是:
Process1 : Ss [可中断睡眠和会话领导者]
openvt : S [可中断睡眠]
python进程:Ss+【可中断睡眠和会话领导者和前台运行进程】
我正在终端 /dev/pts0 [8713] bash 中工作。
当我发送时kill 1234
,它单独杀死 process1 但不杀死它的子进程。所以,我在 Process1 中编写了一个函数,在退出之前杀死它的子进程。
当我使用 trap 调用此函数时:
trap function_name SIGTERM
并发送kill 1234
or kill -15 1234
or kill -s TERM 1234
,陷阱函数不会捕获信号来调用我编写的函数。
再次,当我从 process1 中删除 trap 命令并调用 时kill 1234
,它会杀死 procces1。
我认为当两者都在后台运行时,执行控制在 openvt 上而不是在 process1 上,并且因为 process1 没有收到此终止命令。
现在如何让process1接收kill命令呢?
PS:这里的openvt打开一个新的虚拟终端来运行python进程。用于执行此操作的命令是:openvt -f -s -c 4 -w python_process
。 -w 等待命令完成。
注:来自Linux 杂志如果进程在可中断的睡眠状态(例如等待终端 I/O)时收到信号,内核将唤醒该进程来处理该信号。如果进程在不间断睡眠时收到信号(例如等待磁盘 I/O),则内核会将信号推迟到事件完成为止。
我发送给 process1 的 Kill 信号处于可中断睡眠状态 (S),但内核延迟了该信号.. 为什么?
有一个邮政基于此,但没有解决。
更新1:当我使用命令 pkill -TERM -p pid 杀死父进程的所有子进程时,并且当我调用kill pid 时,信号被 trap 命令捕获。