Javascript 节点';从启动时计划的永久脚本调用时,s spawn()会自动失败

Javascript 节点';从启动时计划的永久脚本调用时,s spawn()会自动失败,javascript,linux,node.js,phantomjs,casperjs,Javascript,Linux,Node.js,Phantomjs,Casperjs,这是一种愚蠢的行为。这个问题很可能与服务器有关,因此我的第一个求助是 我试图让crontab、rc.local或init.d在启动时启动脚本。它将服务器连接到一个端口,我可以通过ping获取一些信息,并让它为我运行无头浏览器 也就是说,我似乎无法从Node.js的spawn()获得响应: 在我将PHANTOMJS_可执行文件env添加到crontab或rc.local(无论用户级别如何似乎都无关紧要)之前,stdout很有用: stdout Fatal:[Errno 2]没有这样的文件或目录;你

这是一种愚蠢的行为。这个问题很可能与服务器有关,因此我的第一个求助是

我试图让crontab、rc.local或init.d在启动时启动脚本。它将服务器连接到一个端口,我可以通过ping获取一些信息,并让它为我运行无头浏览器

也就是说,我似乎无法从Node.js的
spawn()
获得响应:

在我将
PHANTOMJS_可执行文件
env添加到
crontab
rc.local
(无论用户级别如何似乎都无关紧要)之前,stdout很有用:

stdout Fatal:[Errno 2]没有这样的文件或目录;你安装了吗 幻影

关闭错误

既然有了环境变量,在
spawn()之后就根本没有输出了

请注意,如果用户(具有任何权限级别)从bash运行node/forever,Casper将正常启动


我怎么知道
spawn()
失败的原因?

我没有完全理解您的要求。但我在Ubuntu无头服务器上也有类似的情况

我在这里要做的就是我所做的

首先,我的crontab怎么样

crontab -u USER -e

@reboot exec sudo -u USER /bin/bash /home/USER/SHELL_SCRIPT.sh
看,这里我实际上启动了一个shell脚本,而不是节点服务器

现在在这个shell脚本(shell_script.sh)中

即使在my_NODE.js中,我也遵循绝对路径,我只是忽略$path,不使用它

在这个节点服务器中,我进行了100次繁殖


现在,我大约在两年前做过这个,所以如果你问我为什么这样做,我无法回答这个问题,这实际上看起来像是永久、繁殖和casperjs(可能是幻影JS)之间的组合错误。 我能够重现你的问题,我的测试应用程序的完整代码

您没有显示完整的代码,所以我猜您有一个express应用程序,并且有一个特殊的URL来运行casperjs脚本

我构建了一个简单的应用程序,如下所示:

  • 只需使用
    node script.js
    script.js
    是在
    server.js
    中运行casperjs脚本的express应用程序)-它工作正常,呈现响应并将子进程事件处理程序的输出写入控制台
  • 使用init.d脚本以root用户身份启动应用程序-不起作用,一旦生成子应用程序,则不会触发任何事件处理程序
  • 用init.d脚本以root用户身份启动应用程序,用
    echo
    替换casperjs-同样的,不起作用(请参阅,这里我们有一个问题,就是永远以root用户身份运行,
    spawn
    echo
  • 用init.d以普通用户(而不是root用户)的身份启动应用程序,用“echo”替换casperjs——它可以工作,事件处理程序被触发,在这里我几乎可以肯定问题已经解决,但是…:(
  • 使用init.d以普通用户(而不是root用户)的身份启动应用程序,放回casperjs-它不再工作,不会触发事件处理程序
为了解决这个问题,我做了以下工作:

#安装pm2
sudo npm安装-g pm2
#为pm2生成init.d脚本
#此命令将失败,但提示sudo的正确格式
pm2启动ubuntu
#在应用程序所在的文件夹中执行此操作
pm2 start script.js
#记住你的申请
pm2节约
#也有用
#sudo服务停止/启动/重启pm2
#pm2停止/启动/重新启动脚本

现在,
pm2
将自动启动系统,并启动您的应用程序。一切正常,子进程事件处理程序被触发。

您是否专门生成casper或phantom?不,我生成了许多其他东西,即使在生成的进程中我也避免使用$PATH您可以包含脚本的完整源代码吗?具体是什么是
spawn
?我刚才查看了,没有错误回调到child_process.spawn(),如果您使用此
spawn
,请尝试添加sP.on('error',..)处理程序并检查输出。另外,如果您发布crontab或init.d也会很好,这样更容易重现您的问题。
crontab -u USER -e

@reboot exec sudo -u USER /bin/bash /home/USER/SHELL_SCRIPT.sh
    #! /bin/bash
    # SHELL_SCRIPT.sh
    cd /home/USER/
    /home/USER/.npm-packages/bin/forever start -p /home/USER -a -d --watch false --pidFile /home/USER/forever.pid -l /home/USER/forever.log -o /home/USER/forever.out -e /home/USER/forever.err /home/USER/MY_NODE.js