Почему 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
Другие вопросы по тегам