【问题标题】:Not able to get result of Nightmare from cron execution无法从 cron 执行中获得噩梦的结果
【发布时间】:2019-12-17 07:31:53
【问题描述】:

我一直在使用 Nightmare 和 cron 进行一些自动化流程。 Nightmare 运行后,它会获取结果的值并将其附加到我本地计算机中的文件中(未检测到网络问题)。

var Nightmare = require('nightmare');
var fs = require('fs');
var filePath = `${process.env['HOME']}/Documents/ResultCron.txt`;

Nightmare()
    .goto('http://mywebsite.com/form')
    .type('input[id="email"]', 'XXX@gmail.com')
    .click('#submit-button')
    .wait('.formSubmitted')
    .evaluate(() => document.querySelector('.formSubmitted').value)
    .end()
    .then(result => {
      console.log(`The form submitted is:\n${result}`)
      fs.appendFileSync(filePath, `\n${result}: ${new Date()}`);
    })
    .catch(error => {
      console.error(error)
      fs.appendFileSync(filePath, `\nERROR: ${error}: ${new Date()}`);
    })

当我使用node /home/user/Documents/nightmareForm.js 运行它时,它运行良好并写入文件。但是,当从 cron 执行时,它不会将任何内容附加到文件中。

我已将配置添加到 crontab 中,如下所示:

crontab -e

# It will be executed everyday at 13:00
0 13 * * * node /home/user/Documents/nightmareForm.js

如果我这样做 grep nightmareForm.js /var/log/syslog -C 10 我可以看到它已被执行: Apr 24 13:00:00 PC CRON[1223]: (root) CMD (node /home/user/Documents/nightmareForm.js)

继续调查,该文件具有以下权限(Ubuntu 18.10):-rwxr-xr-x,因此它应该是可执行的,并且创建的文件具有以下权限:-rw-rw-rw-

更新:在@ponury-kostek 的想法之后,我验证了脚本可以写入文件,但它永远不会到达 then() 或 catch() 块

Update2:我试图从 crontab 中捕获日志,但没有显示任何错误:0 13 * * * /usr/local/bin/node /home/user/Documents/nightmareForm.js >> /home/user/Documents/nightmareForm.log 2>&1

任何想法为什么从 crontab 脚本无法到达 then() 或 catch() 块? 谢谢

【问题讨论】:

  • 当您执行sudo crontab -e 时,您正在为root (process.env['HOME'] === "/root/") 而非您的用户编辑cron。只做crontab -e 没有sudo
  • @ponury-kostek 感谢您的回答,但是,使用 sudo 或不使用 sudo 的行为相同。使用信息记录(我们确实可以看到 root 没有在这个中运行):Apr 24 14:39:01 PC CRON[25564]: (user) CMD (node /home/user/Documents/nightmareForm.js)
  • const fs = require("fs"); fs.appendFileSync("/tmp/crone_test.txt", JSON.stringify(process.env));创建文件并从cron运行它,然后检查HOME下设置的内容
  • 你完全正确,代码的执行可以创建和附加细节到文件中。问题在于 Nightmare 脚本的执行。它永远不会进入 then() 或 catch() 块...我会更新问题的描述,再次感谢!
  • try/catch 块和在某处记录结果,我认为nightmare 不适用于您的脚本

标签: javascript node.js cron fs nightmare


【解决方案1】:

我遇到了同样的问题。

我的工作是使用 xvfb-run 来启动节点进程。

xvfb-run node myscript.js

实际上我制作的 shellscript (go.sh) 只包含 3 行:

#!/bin/bash
cd /home/me/nodestuff/spkfetch
xvfb-run node fetch_umsaetze.js

并将其添加到 crontab 中:

* * * * *  cd /home/norbert/nodestuff/spkfetch && sh go.sh  >> /home/norbert/nodestuff/spkfetch/log/log.txt  2>&1

我从未尝试将 xvfb-run 调用直接放入 crontab,但我认为这可能是脚本不允许启动 X 进程(窗口)或类似的问题.也许值得尝试将其直接放入 cron 命令中。

这是引导我找到此解决方案的页面:
https://www.nickhart.co.uk/2019/08/09/scraping-with-nightmarejs-getting-started/#run_on_server

【讨论】:

  • 实际上不需要添加 go.sh 文件 :) 我设法直接在 crontab 上运行 xvfb-run
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2020-03-14
  • 2010-11-13
相关资源
最近更新 更多