杀死一个bash脚本不杀子进程
我已经写它运行另一个脚本来启动服务器来测试一个测试脚本。当测试完成运行测试脚本时SIGKILL
消息被发送到服务器进程,但是服务器再次抛出一个EADDRINUSE
错误(我在Node.js的环境),这意味着服务器正在尝试安装到港目前正在使用中。这个过程中我们想杀了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,如果分离的选项设置,子进程将作出一个新的进程组和会话的领导者。
这里引用的man 2 kill
一些细节的部分内容:
如果pid为小于-1,则SIG被发送到每一个过程,其ID是-pid处理组中使用。
另一种选择可能是使用trap
在你的shell脚本拦截信号,杀死所有的孩子们,并使用从child.kill('SIGTERM')
node
(如SIGKILL
不会被trap
拦截)
#!/bin/bash
trap 'kill $(jobs -p)' EXIT
node_modules/.bin/babel-node --stage 0 index.js
杀死一个bash脚本不杀子进程
我已经写它运行另一个脚本来启动服务器来测试一个测试脚本。当测试完成运行测试脚本时SIGKILL
消息被发送到服务器进程,但是服务器再次抛出一个EADDRINUSE
错误(我在Node.js的环境),这意味着服务器正在尝试安装到港目前正在使用中。这个过程中我们想杀了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,如果分离的选项设置,子进程将作出一个新的进程组和会话的领导者。
这里引用的man 2 kill
一些细节的部分内容:
如果pid为小于-1,则SIG被发送到每一个过程,其ID是-pid处理组中使用。
另一种选择可能是使用trap
在你的shell脚本拦截信号,杀死所有的孩子们,并使用从child.kill('SIGTERM')
node
(如SIGKILL
不会被trap
拦截)
#!/bin/bash
trap 'kill $(jobs -p)' EXIT
node_modules/.bin/babel-node --stage 0 index.js