【发布时间】:2016-01-24 08:17:23
【问题描述】:
我编写了一个测试脚本,它运行另一个脚本来启动服务器进行测试。当测试完成时,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')
【问题讨论】:
-
你试过
child.kill('SIGINT')可能节点不支持SIGKILL信号,然后会假设默认为:SIGTERM:nodejs.org/api/… -
我试过
SIGINT、SIGKILL、SIGHUP、SIGQUIT和SIGTERM。根据我的阅读,SIGKILL似乎是最符合语义的方式。 -
用
.close()定期关闭服务器而不是杀死进程不是更好吗? -
我没有看到
.close()记录的 here -
不,我的意思是从你的服务器代码nodejs.org/api/net.html#net_server_close_callback关闭服务器
标签: node.js bash process child-process sigkill