Cal*_*mer 10 bash process sigkill child-process node.js
我编写了一个测试脚本,它运行另一个脚本来启动服务器测试.测试完成后SIGKILL
,会向服务器进程发送一条消息,但是当再次运行测试脚本时,服务器会抛出一个EADDRINUSE
错误(我在node.js环境中),这意味着服务器正在尝试挂载的端口当前正在使用.我们试图用a杀死的进程SIGKILL
仍然在运行.我不认为这是一个特定于节点的问题,而是因为我对bash流程如何工作缺乏教育.
以下是一些细节,这是我的开始脚本scripts/start-node.sh
:
#!/bin/bash
node_modules/.bin/babel-node --stage 0 index.js
Run Code Online (Sandbox Code Playgroud)
这是我的节点服务器调用index.js
(我没有创建任何process
事件监听器):
Http.createServer(…).listen(PORT, () => console.log(`Server listening on ${PORT}`))
Run Code Online (Sandbox Code Playgroud)
并且启动脚本由节点child_process
模块控制:
var child = child_process.spawn('scripts/start-node.sh')
// Later…
child.kill('SIGKILL')
Run Code Online (Sandbox Code Playgroud)
Jui*_*ter 12
要杀死子进程及其所有子进程,您可以使用process.kill
负数pid
(杀死进程组)
var child = child_process.spawn('scripts/start-node.sh', {detached: true})
// Later…
process.kill(-child.pid, 'SIGKILL');
Run Code Online (Sandbox Code Playgroud)
查看有关child_process
文档的详细信息options.detached
在非Windows上,如果设置了分离选项,则子进程将成为新进程组和会话的领导者.
在这里引用一部分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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3133 次 |
最近记录: |