我想创建一个 Node.js Puppeteer cronjob,但是 Puppeteer 仅在从 cronjob 执行时才会中断且不会出现任何错误。
我尝试的脚本在从根文件夹手动执行(通过终端)时工作得很好,但是每当我尝试将其作为 cronjob 执行并且执行停止时,似乎就会出现问题。
我制作了一些console.logs来帮助我定位问题,发现脚本的执行在
const browser = await puppeteer.launch()
处中断。请参阅下面的代码以了解我在说什么:
'use strict'
console.log('Node script starts!');
const puppeteer = require('puppeteer');
(async () => {
console.log('test 1');
//Code stops here
const browser = await puppeteer.launch();
console.log('test 2');
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({
path: '0_ScreenShot.png'
});
await browser.close();
})();
因此通过 SSH 手动执行上述代码:
[site@server ~]$ cd public_html/test/
然后:
[site@server test]$ nohup node ctest.js > out.log &
我的
out.log
文件输出以下内容并在/test/0_ScreenShot.png
下保存屏幕截图,这是预期的结果:
Node script starts!
test 1
test 2
但由于某种原因,这就是我在这里的原因,通过 cronjob 执行同一个文件不起作用,
out.log
仅打印以下内容:
Node script starts!
test 1
有问题的 cronjob 从 cPanel 设置为:
./bin/node ./public_html/test/ctest.js > ./public_html/test/out.log &
我认为这是一个路径问题,并尝试通过将 Puppeteer 初始化更改为此来尽可能绝对,但没有运气:
const browser = await puppeteer.launch({
executablePath: '/home/site/public_html/test/node_modules/puppeteer/.local-chromium/linux-654752/chrome-linux/chrome'
});
我什至下载了一个新的 Chromium 并使用了它,但仍然没有任何结果:
const browser = await puppeteer.launch({
executablePath: '/home/site/public_html/test/node_modules/chromium/lib/chromium/chrome-linux/chrome'
});
我使用 bash 脚本 (
shell_node.sh
) 来执行节点脚本,但同样的问题仍然存在:
#!/usr/bin/env sh
nohup ./bin/node ./public_html/test/ctest.js > ./public_html/test/out.log &
克朗:
bash ./public_html/test/shell_node.sh
我还尝试使用
exec()
函数通过 PHP 执行脚本,但仍然没有任何结果。
我到处寻找解决方案,但感觉我是第一个遇到这个特定问题的人..这令人担忧,但我希望这里有人能回答我。
感谢您的阅读和您的时间。
感谢 Zach ['--no-sandbox', '--disable-setuid-sandbox'] 的出色工作!在发现这一点之前,我整整一个星期都在用头撞桌子!基本问题都是“在线”工作,但不能从调度程序中工作,既不能真正调度并注销,也不能在调度程序中选择“运行”。谢谢扎克!