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

时间:2015-10-25 01:45:36

标签: node.js bash process child-process sigkill

我编写了一个测试脚本,它运行另一个脚本来启动服务器测试。测试完成后,将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')

4 个答案:

答案 0 :(得分:12)

要杀死子进程及其所有子进程,您可以使用process.kill使用负pid(以终止进程组)

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

查看有关options.detached

child_process文档的详细信息
  

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

在此处引用man 2 kill的一部分以获取一些细节:

  

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

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

#!/bin/bash

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

答案 1 :(得分:0)

在服务器中有处理器信号的处理程序

server.js

 var http = require('http');

function handleRequest(request, response){
    response.end("Hello");
}
var server = http.createServer(handleRequest);

server.listen(3000, function(){console.log("listening...")});
process.title="testserver"

process.on('SIGQUIT', function() {
  server.close()
});

startup.sh

 #!/bin/bash
 node server.js & echo "started"

然后有一个" shutdown.sh"。

shutdown.sh

#!/bin/bash
pkill -QUIT testserver & echo "stoped"

如果您在" start-node.sh"中生成多个进程,它将终止具有该名称的所有进程。通过这种方式,您可以在关闭时获得一些清理代码,例如关闭所有连接等。

在你的测试运动员中你可以做到

var exec = require('child_process').exec;
exec("./start.sh")
// later...
exec("./stop.sh")

答案 2 :(得分:0)

简单地:

val data: YourData by lazy { arguments?.getParcelable("dataKey") as YourData }
  每次我们杀死它时,

node都会创建子进程。所以不是   可以通过kill,pkill或killall命令杀死该进程。所以   我们要删除节点命令以使分叉过程失败,然后我们   终止进程。最后,我们恢复了node命令。

答案 3 :(得分:-1)

您的脚本中是否有退出0

示例:

    #!/bin/bash

    ifconfig

    exit 0