我想制作一个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 &
Cron:
bash ./public_html/test/shell_node.sh
我还尝试了使用exec()
函数通过PHP执行脚本,
我到处都在寻找解决方案,但感觉就像我是有史以来第一个遇到此特定问题的人。这令人担忧,但我希望这里的人可以回答我。
感谢您的阅读和时间。