分离的子进程在node.js中的脚本出口处退出

时间:2013-12-05 17:33:42

标签: node.js gruntjs child-process yeti

据我所知,我已经按照api文档中的说明操作了。我使用选项detached:true, stdio:['ignore','ignore','ignore']生成过程,我在ChildProcess上调用unref。 ChildProcess有一个pid,所以我认为它已成功启动。我正试图从一个咕噜咕噜的任务中启动一个雪人服务器。此代码位于异步调用中,因此next继续执行并最终完成任务。我使用which获取cmd,并使用Mac OSX 10.9上/usr/local/bin中yeti脚本的正确路径。端口也定义为空端口。如果我在命令行上运行相同的命令它就可以正常工作。在grunt退出后,我调用ps aux | grep nodeps aux并grep查找已记录的pid,并且没有任何内容正在运行。这是代码:

yeti = spawn("" + cmd + " --server --port " + port, [], {
  detached: true,
  stdio: ['ignore', 'ignore', 'ignore']
});
yeti.unref();
next("Yeti server is running. pid: " + yeti.pid);

2 个答案:

答案 0 :(得分:4)

试试这个:

spawn(cmd, ["--server", "--port", port], {
  detached: true,
  stdio: ['ignore', 'ignore', 'ignore']
});

我没有看到spawn的一个例子,其中所有内容都作为第一个参数传递。我一直看到它使用的第一个参数只是命令名(即可执行文件名或可执行文件的路径),第二个参数是字符串数组。

您看到pid的事实并不是很明显,因为在Unix类型系统上,spawnfork然后execfork可以成功,因此您会看到一个新的pid,但exec失败,因为可执行文件的名称对操作系统没有意义。

答案 1 :(得分:0)

如果您在调查为什么您的进程在您杀死父级时退出时发现了这一点,尽管它已经分离,并且您正在使用PM2: https://github.com/Unitech/pm2/issues/1036

pm2使用kill process tree。这会杀死整个进程树。使用{{1}}运行cli命令将解决此问题。

还相关:https://github.com/Unitech/PM2/issues/1564