杀死bash脚本不会杀死子进程

卡勒伯默

我编写了一个测试脚本,该脚本运行另一个脚本来启动服务器进行测试。测试完成后SIGKILL,会向服务器进程发送一条消息,但是,当再次运行测试脚本时,服务器会抛出EADDRINUSE错误(我在node.js环境中),这意味着服务器试图挂载的端口当前是正在使用。我们尝试用a杀死的进程SIGKILL仍在运行。我不认为这不是节点特定的问题,而是我对bash流程的工作方式缺乏教育。

这里是一些细节,这是我的启动脚本scripts/start-node.sh

#!/bin/bash

node_modules/.bin/babel-node --stage 0 index.js

这是我的节点服务器index.js(我尚未编写任何process事件侦听器):

Http.createServer(…).listen(PORT, () => console.log(`Server listening on ${PORT}`))

启动脚本由节点child_process模块控制

var child = child_process.spawn('scripts/start-node.sh')
// Later…
child.kill('SIGKILL')
多汁的脚本

要杀死一个子进程及其所有子进程,可以使用process.kill否定项pid(杀死一个进程组)

var child = child_process.spawn('scripts/start-node.sh', {detached: true})
// Later…
process.kill(-child.pid, 'SIGKILL');

请参阅有关child_process文档的详细信息options.detached

在非Windows上,如果设置了detached选项,则子进程将成为新进程组和会话的领导者。

在此处引用部分的man 2 kill详细信息:

如果pid小于-1,则将sig发送到ID为-pid的进程组中的每个进程。


另一个选择可能是trap在您的shell脚本中使用来拦截信号并杀死所有子级,然后使用child.kill('SIGTERM')from node(因为SIGKILL不会被拦截trap

#!/bin/bash

trap 'kill $(jobs -p)' EXIT
node_modules/.bin/babel-node --stage 0 index.js

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用bash脚本杀死子进程

来自分类Dev

当主进程被杀死时,bash子进程不会被杀死

来自分类Dev

杀死bash和子进程

来自分类Dev

在脚本完成或被杀死后杀死子进程

来自分类Dev

超时而不会杀死bash中的进程

来自分类Dev

杀死bash脚本创建的进程的最佳方法?

来自分类Dev

杀死NodeJS子进程

来自分类Dev

杀死Popen子进程

来自分类Dev

杀死父进程不会杀死孩子

来自分类Dev

仅杀死父进程,不杀死bash中的子进程和父进程

来自分类Dev

如何在不杀死子进程的情况下杀死父shell脚本进程?

来自分类Dev

Bash子进程在执行eval exec时会杀死父进程

来自分类Dev

退出脚本时杀死bash脚本中的后台进程

来自分类Dev

tmux kill-window不会杀死子进程

来自分类Dev

杀死端口的 Bash 脚本

来自分类Dev

编写脚本杀死用户进程?

来自分类Dev

用Bash脚本查找并杀死带有某些参数的进程?

来自分类Dev

如何避免杀死bash脚本中的错误进程?

来自分类Dev

Bash脚本,用于杀死具有特定名称的进程

来自分类Dev

在Bash脚本中杀死所有静默进程

来自分类Dev

用Bash脚本查找并杀死带有某些参数的进程?

来自分类Dev

在bash脚本中检查并杀死挂起的后台进程

来自分类Dev

很好地杀死bash进程

来自分类Dev

Linux Bash 杀死连续的进程

来自分类Dev

子进程bash脚本不会全局修改环境变量

来自分类Dev

Bash 脚本不会与 Python 中的子进程一起运行

来自分类Dev

如何杀死所有子进程而不杀死父进程

来自分类Dev

如何同时杀死进程和子进程?

来自分类Dev

杀死子管道进程的父进程