1

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

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

2 回答 2

4

尝试这个:

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

我还没有看到将spawn所有内容作为第一个参数传递的单个示例。我总是看到它与第一个参数一起使用的只是命令名称(即可执行文件名称或可执行文件的路径),第二个参数是一个字符串数组。

您看到 pid 的事实并不能说明太多,因为在 Unix 类型的系统上,spawnwillfork和 then exec. fork可能会成功,因此您会看到一个新的 pid,但会失败exec,因为可执行文件的名称对操作系统没有意义。

于 2013-12-05T17:42:23.283 回答
0

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

pm2 使用终止进程树。这会杀死整个进程树。运行 cli 命令--no-treekill可以解决这个问题。

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

于 2017-09-08T22:43:53.997 回答