Я хочу сделать cronjob Node.js Puppeteer, но 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
Я также пытался выполнить сценарий с помощью PHP с помощью функции exec()
, ничего не вышло.
Я искал повсюду решение, но мне кажется, что я первый человек, который когда-либо сталкивался с этой конкретной проблемой ... что вызывает беспокойство, но я надеюсь, что кто-то отсюда может ответить мне.
Спасибо за ваше чтение и ваше время.