我想构建一个 Node 应用程序,它允许我将 kill -9
发送到一个守护进程的所有子进程。
要清楚。 我们的服务器上有一个守护进程。在一开始,它启动了一个与我们的客户沟通的过程。
当客户端向服务器发送新作业时,守护进程会创建一个新的子进程。
所以现在我想获取守护进程的所有子进程,kill -9
它们,然后使用 systemctl restart mydaemon.service
重启守护进程
我搜索了谷歌,但没有找到适合我的问题的内容。
我要说的是,我想在不知道守护进程 process-id 的情况下解决这个问题,当然是在可能的情况下。
为什么我需要这个
为什么我需要这样做是因为守护进程所属的软件存在错误。我上面提到的沟通过程失败了,就这样消失了。卖家说只要重启守护进程就可以杀死所有进程,当然不是。因此,由于卖家无法为我们的问题提供任何解决方案,因此目前以我现在想要自动化的方式重新启动服务。用 SIGKILL 杀死所有 child ,然后重新启动守护进程。
非常感谢你们。
最佳答案
您可以使用 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
错误。
关于javascript - Node : get child processes of a daemon and kill them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702034/