Почему cron не выполняет мой скрипт node.js?
Я хочу, чтобы мой сервер выполнял скрипт узла каждую минуту. Программа выполняется отлично, если я запускаю файл вручную (./main.js
), так что я уверен, что это не проблема. Но когда я передаю его cron для выполнения, ничего не происходит.
Вот строка из файла cron.
*/1 * * * * /home/bryce/scripts/wudu/main.js
А вот пример журнала:
Oct 11 15:21:01 server CROND[2564]: (root) CMD (/home/bryce/scripts/wudu/main.js)
Исполняемый файл: home/bryce/scripts/wudu/main.js
#!/usr/bin/env node
var program = require('commander');
var v = require('./cli/validation');
var a = require('./cli/actions');
program
.version('0.0.1')
.option('-u, --url', 'Register url')
.option('-s, --selector', 'Register selector')
.option('-p, --pagination', 'Register pagination')
.option('-i, --index', 'Pass an index, to destroy')
.parse(process.argv);
var args = process.argv.slice(2),
mode = v.mode(args[0]),
options = v.hasArgs(mode, program);
a.init(mode, options);
Любая идея, почему я получаю радио молчание? Где-то еще я должен искать отладку?
ОБНОВИТЬ:
Я полагаю, что проблема связана с моими относительными filepaths и main.js, выполняемыми вне его собственного каталога.
Итак, я разместил exe.sh
в wudu
каталог. Это выглядит так:
#!/bin/bash
cd ${0%/*}
./main.js mail
exit
Теперь я установил cron для выполнения этого файла каждую минуту. Я попытался выполнить этот файл из других папок, и он работает как положено. Но опять же, Хрон не поднимает это.
3 ответа
Оборачивая выполнение в сценарии оболочки, скорее всего, выполнение сценария в cron не имеет такой же среды, как при запуске из командной строки.
Попробуйте предварительно настроить выполнение сценария оболочки в cron с настройкой NODE_PATH
& PATH
(если вам нужны эти значения, введите в командной строке: echo $NODE_PATH
а также echo $PATH
)
Итак, ваша запись cron будет выглядеть так:
*/1 * * * * NODE_PATH=/usr/local/lib/node_modules PATH=/opt/local/bin:ABC:XYZ /home/bryce/scripts/wudu/exe.sh
Просто убедитесь, что подставили фактические значения NODE_PATH
& PATH
с тем, что вы получаете от echo
команды, которые вы впервые сделали.
У меня была точно такая же проблема, поэтому я закончил создание проходного скрипта, который загружал бы мои переменные окружения, а затем выполнял узел следующим образом:
##!/bin/bash
# Source bash profile to load env variables
# or any other that you want to set explicitly
. ~/.bash_profile
# tunnel that allows us to execute cron jobs
node $1 $2
Чтобы использовать просто добавьте его в свой crontab
* * * * * <user> <passthrough_script> <arg1> <arg2>
Вы можете попробовать запустить файл bash прямо из cron?
то есть
0 4 * * * source ~/.bashrc && cd /projects/my-project && node index.js