我编写了一个测试脚本,该脚本运行另一个脚本来启动服务器进行测试。测试完成后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] 删除。
我来说两句