据我所知,我已经按照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 node
和ps 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);
答案 0 :(得分:4)
试试这个:
spawn(cmd, ["--server", "--port", port], {
detached: true,
stdio: ['ignore', 'ignore', 'ignore']
});
我没有看到spawn
的一个例子,其中所有内容都作为第一个参数传递。我一直看到它使用的第一个参数只是命令名(即可执行文件名或可执行文件的路径),第二个参数是字符串数组。
您看到pid的事实并不是很明显,因为在Unix类型系统上,spawn
将fork
然后exec
。 fork
可以成功,因此您会看到一个新的pid,但exec
失败,因为可执行文件的名称对操作系统没有意义。
答案 1 :(得分:0)
如果您在调查为什么您的进程在您杀死父级时退出时发现了这一点,尽管它已经分离,并且您正在使用PM2: https://github.com/Unitech/pm2/issues/1036
pm2使用kill process tree。这会杀死整个进程树。使用{{1}}运行cli命令将解决此问题。