Javascript 节点';从启动时计划的永久脚本调用时,s spawn()会自动失败
这是一种愚蠢的行为。这个问题很可能与服务器有关,因此我的第一个求助是 我试图让crontab、rc.local或init.d在启动时启动脚本。它将服务器连接到一个端口,我可以通过ping获取一些信息,并让它为我运行无头浏览器 也就是说,我似乎无法从Node.js的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]没有这样的文件或目录;你
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