我想构建一个节点应用程序,它允许我将kill -9
发送到一个守护进程的所有子进程。
要清楚。 我们的服务器上有一个守护进程。在它开始时,它启动了与客户沟通的过程。
当客户端向服务器发送新作业时,守护程序会创建一个新的子进程。
所以现在我想获取守护进程的所有子进程kill -9
,然后使用systemctl restart mydaemon.service
我搜索了谷歌并没有发现任何符合我问题的内容。
我需要说的是,我想在不知道守护进程进程ID的情况下解决这个问题,当然只有在可能的情况下才能解决。
为什么我需要这样做是因为守护进程所属的软件是错误的。我上面提到的沟通过程失败了,简直消失了。卖家说只需重新启动守护进程就可以杀死所有进程,当然这不是。因为卖家无法为我们的问题提供任何解决方案,目前正在重新启动服务,就像我现在要自动化它一样。使用SIGKILL杀死所有孩子,然后重启守护进程。
非常感谢你们。
答案 0 :(得分:0)
您可以使用pstree
实用程序找到所有子进程(递归)。
很可能需要安装它。例如,在Mac上,您可以:brew install pstree
。
然后,您可以运行此代码段来查找所有子进程并将其终止:
const child_process = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(child_process.exec);
(async () => {
const pids = await execAsync(
`pstree ${process.pid} | sed 's/[^0-9]*\\([0-9]*\\).*/\\1/' | grep -v "${process.pid}"`
);
// Join the pids into one line separated by space
const pidsString = pids.stdout.replace(/[\r\n]+/g, ' ');
await execAsync(`kill -9 ${pidsString} || true`);
})();

请在下面找到详细说明:
sed 's/[^0-9]*\\([0-9]*\\).*/\\1/'
- 仅保留pids
,删除其余字符串
grep -v "${process.pid}"
- 从列表中删除当前流程,我们不想将其删除
kill -9 ${pidsString} || true
- 使用SIGKILL
杀死子进程。
我必须执行|| true
,因为pstree
会返回包含其自身的完整进程列表(它还会在内部生成ps
)。当我们开始查杀时,这些进程已经结束,因此我们需要它来抑制No such process
错误。