Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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
Javascript nodejs:获取守护进程的子进程并杀死它们_Javascript_Node.js_Process_Kill - Fatal编程技术网

Javascript nodejs:获取守护进程的子进程并杀死它们

Javascript nodejs:获取守护进程的子进程并杀死它们,javascript,node.js,process,kill,Javascript,Node.js,Process,Kill,我想构建一个节点应用程序,它允许我向一个守护进程的所有子进程发送kill-9 说清楚。 我们的服务器上有一个守护进程。开始时,它启动了一个与客户沟通的流程 当客户端向服务器发送新作业时,守护进程将创建一个新的子进程 所以现在我想获取守护进程的所有子进程,kill-9它们,然后用systemctl restart mydaemon.service重启守护进程 我搜索了谷歌,没有找到任何适合我的问题 我需要说的是,我想在不知道守护进程id的情况下解决这个问题,当然只有在可能的情况下 为什么我需要这个

我想构建一个节点应用程序,它允许我向一个守护进程的所有子进程发送
kill-9

说清楚。 我们的服务器上有一个守护进程。开始时,它启动了一个与客户沟通的流程

当客户端向服务器发送新作业时,守护进程将创建一个新的子进程

所以现在我想获取守护进程的所有子进程,
kill-9
它们,然后用
systemctl restart mydaemon.service
重启守护进程

我搜索了谷歌,没有找到任何适合我的问题

我需要说的是,我想在不知道守护进程id的情况下解决这个问题,当然只有在可能的情况下

为什么我需要这个 我之所以需要这样做,是因为守护进程所属的软件有缺陷。我上面提到的沟通过程失败了,完全消失了。卖方表示,只需重新启动守护进程就可以杀死所有进程,当然不是这样。因此,由于卖家无法为我们的问题提供任何解决方案,我们目前正在以我现在想要的自动化方式重新启动服务。使用SIGKILL杀死所有child,然后重新启动守护进程


非常感谢各位。

您可以使用
pstree
实用程序(递归)查找所有子进程。 很可能需要安装它。例如,在Mac上,您可以执行以下操作:
brew安装pstree

然后,您可以运行此代码段来查找所有子进程并杀死它们:

const child_process=require('child_process');
const{promisify}=require('util');
const execAsync=promisify(child_process.exec);
(异步()=>{
const pids=等待执行异步(
`pstree${process.pid}sed的/[^0-9]*\\([0-9]*\\)./\\1/''grep-v“${process.pid}”`
);
//将PID连接到一行中,以空格分隔
const pidsString=pids.stdout.replace(/[\r\n]+/g',);
wait execAsync(`kill-9${pidsString}| | true`);

})();非常感谢安东尼奥,但不幸的是,这不是我要搜索的。我不想获取我的节点应用程序的子项。我想杀死一个与我的节点应用程序无关的独立守护进程的子进程。或者我可以在通过守护进程搜索pid时对所有守护进程使用它吗?@floriantaut当然可以,只要使用deamon的pid而不是
进程。pid
这里:
pstree${deamon\u pid}sed's/[^0-9]*\([0-9]*\./\\1/'
您也不需要
grep-v
部分。请让我知道它是否适合您。谢谢,我会尝试一下,您有一个简短的代码行如何通过守护程序名称捕获pid吗?@floriantaut您可以尝试
pgrep processName
。顺便说一句,如果您决定从bash中杀死子进程。。。您可以简单地执行以下操作:pgrep processName | xargs pstree | sed的/[^0-9]*([0-9]*)./\1/'| xargs kill