javascript - Node 的 spawn() 在从启动时计划的永久脚本中调用时静默失败

标签 javascript linux node.js phantomjs casperjs

这有点奇怪。这个问题很可能与服务器有关,所以我的第一个求助是 AskUbuntu over here .

我正在尝试让 crontab 或 rc.local 或 init.d 启动 forever开机脚本。它将一个服务器连接到一个端口,我可以用一些信息 ping 并让它为我运行一个 headless 浏览器。

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

var CASPER_PATH = '/home/ubuntu/dev/casperjs/bin/casperjs'; // actual binary location, not a symlink
var SCRIPTS_PATH = '/home/custom_user/endpoints/server.js';

var fileName = req.body.source + '_' + req.body.type + '.coffee'; // looks like: mysource_my_scrape_type.coffee
var scrapeId = 'test_scrape';
var user = 'user123';
var pass = 'pass123';
if (fs.existsSync(SCRIPTS_PATH + fileName)) {
  // If file is in place, spawn casperjs
  var sP = spawn(CASPER_PATH, 
    [SCRIPTS_PATH + fileName, '--ssl-protocol=any', '--user='+user, '--scrapeId='+scrapeId, '--pass='+pass], 
    { detached: true }, 
    function (err, stdout, stderr) {});
  sP.stdout.on('data', function(data) { console.log('stdout', data.toString('utf8')); });
  sP.stderr.on('data', function(data) { console.log('stderr', data.toString('utf8')); });
  sP.stdout.on('close', function(code) { console.log('close', code); });
  res.send({ scheduled: true, key: scrapeId });
} else {
  res.send({ scheduled: false, error: 'Incorrect source, type or the script is missing.' });
}

在我将 PHANTOMJS_EXECUTABLE env 添加到 crontabrc.local 之前(无论用户级别如何,似乎都不重要),stdout 是有用:

stdout Fatal: [Errno 2] No such file or directory; did you install phantomjs?

close false

现在环境变量已经存在,spawn() 之后根本没有输出。

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

我如何知道 spawn() 失败的原因?

最佳答案

这实际上看起来像是 forever、spawn 和 casperjs(可能是 phantomjs)之间的组合错误。 我能够重现您的问题,here is我的测试应用程序的完整代码。

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

我构建了一个像这样的简单应用程序,它的行为是这样的:

  • 只需使用 node script.js 启动应用程序(script.js 是在 server.js 中运行 casperjs 脚本的快速应用程序) - 它工作正常,呈现响应并将子进程事件处理程序的输出写入控制台
  • 以 root 身份使用 init.d 脚本启动应用程序 - 不起作用,一旦生成子项,就不会触发任何事件处理程序
  • 以 root 身份使用 init.d 脚本启动应用程序,将 casperjs 替换为 echo - 同样,不起作用(看,这里我们遇到了这个问题,只有 forever以 root 身份运行,spawnecho)
  • 以普通用户(非 root)身份使用 init.d 启动应用程序,将 casperjs 替换为 'echo' - 它有效,事件处理程序被触发,在这里我几乎可以肯定问题已解决,但是...... :(
  • 以普通用户(非 root)身份使用 init.d 启动应用程序,放回 casperjs - 它不再工作,不会触发事件处理程序

它使用的实际解决方案 pm2 ,我这样做了:

# install pm2
sudo npm install -g pm2
# generate init.d scripts for pm2
# this command will fail, but hint about the correct format with sudo
pm2 startup ubuntu
# do this in the folder with your application
pm2 start script.js
# remember your application
pm2 save
# also useful
# sudo service stop/start/restart pm2
# pm2 stop/start/restart script

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

关于javascript - Node 的 spawn() 在从启动时计划的永久脚本中调用时静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35079789/

相关文章:

linux - 通过python进行glob函数后的文件编辑

node.js - 错误 npm install 没有适用于 https-proxy-agent-snyk-fork 的有效版本

linux - 即使使用 #!/bin/bash shebang,bash 也不会执行 'at -f foo.sh' 命令

Javascript:从字符串中删除原始字符和重复字符

javascript - Jquery/Javascript 向 div 添加独特的类

javascript - 滚动元素上的渐变在Safari中突然消失

python - 删除文本文件中的非重复行

node.js - Meteor的远程数据库连接超时和重新连接

javascript - process.env.API_URL 未定义

c# - 如何运行 DropDownList 更改事件