Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 杀死守护进程的所有子进程_Bash_Subprocess_Kill_Init.d_Lsb - Fatal编程技术网

Bash 杀死守护进程的所有子进程

Bash 杀死守护进程的所有子进程,bash,subprocess,kill,init.d,lsb,Bash,Subprocess,Kill,Init.d,Lsb,我正在编写一个/etc/init.d/mydaemon: my/usr/local/bin/mydaemon: 好了,这应该行得通,因为: 守护进程在/var/run/mydaemon.PID中记录mydaemon的PID killproc读取该PID并向该PID发送SIGTERM。 mydaemon捕获此信号,禁用陷阱并将SIGTERM发送到整个PGRP,包括带有一些参数的二进制进程。 然而,这不起作用。停止服务后,mydaemon终止,但binary仍在运行 我遗漏了什么,停止守护进程及其所

我正在编写一个/etc/init.d/mydaemon:

my/usr/local/bin/mydaemon:

好了,这应该行得通,因为:

守护进程在/var/run/mydaemon.PID中记录mydaemon的PID killproc读取该PID并向该PID发送SIGTERM。 mydaemon捕获此信号,禁用陷阱并将SIGTERM发送到整个PGRP,包括带有一些参数的二进制进程。 然而,这不起作用。停止服务后,mydaemon终止,但binary仍在运行

我遗漏了什么,停止守护进程及其所有子进程的最佳实践是什么

顺便说一句:

当my/usr/local/bin/mydaemon为:

#!/bin/bash
binary with some args &
echo $! $$ > /var/run/mydaemon.pid
wait

它工作正常,但对我来说,这似乎不太可靠,有时二进制调用不太直接,或者它有自己的子进程,等等。如果您将父进程id给pkill,它将杀死所有子进程:

pkill -TERM -P parentID

如果将父进程的id提供给pkill,它将杀死所有子进程:

pkill -TERM -P parentID
您可以设置一个陷阱,当接收到SIGINT时,它负责清理过程。例如:

function cleanup { kill $CHILDPID; exit 0; }
trap cleanup SIGINT SIGTERM
有关更多示例,请参阅。

您可以设置一个陷阱,当接收到SIGINT时,该陷阱负责清理过程。例如:

function cleanup { kill $CHILDPID; exit 0; }
trap cleanup SIGINT SIGTERM

有关更多示例,请参见。

有关问题中介绍的特定场景,还值得考虑/usr/local/bin/mydaemon的以下选项:


binary不会在具有新PID的子进程中运行,而是将接管shell进程PID,从而直接接收来自init脚本的信号。

对于问题中介绍的特定场景,还值得考虑/usr/local/bin/mydaemon的以下选项:

二进制文件将取代shell进程PID,而不是在具有新PID的子进程中运行,因此将直接接收来自init脚本的信号

#!/bin/bash
exec binary with some args