Запуск cronjob с разными параметрами каждый день

12

Я программист, и я не знаю много о кронах, но я хочу знать, возможно ли это.

Допустим, у меня есть массив [option1, option2, option3]и скрипт, который я запускаю в NodeJS script.js. Я хочу запускать этот скрипт каждый день в 1 час ночи. Команда cronэтого будет:

0 1 * * * node ~/script.js

Ну, теперь сложная часть, я хочу менять параметры каждый день, например, в понедельник, когда я хочу запустить node ~/script.js option1, на следующий день node ~/script.js option2и так далее. Кроме того, я хочу иметь возможность добавлять / удалять параметры, когда это необходимо, но вращение должно оставаться неизменным.

Это возможно каким-либо образом? Я знаю, что мог бы сделать это и внутри узла, но я бы предпочел сделать это вне скрипта и оставить скрипт как есть.

Саиф Бечан
источник
2
Я бы порекомендовал написать скрипт против этого, пытаясь заставить cron сделать это самому.
earthmeLon

Ответы:

15

Кроме того, я хочу иметь возможность добавлять / удалять параметры, когда это необходимо, но вращение должно оставаться неизменным.

Это сложно. Что означает, что вращение остается неизменным после изменения списка опций? В конце концов, вы могли бы полностью перестроить список, уничтожив любую подсказку о том, где вы находитесь.

То, что вы, вероятно, могли бы сделать, это создать каталог с файлами, которые представляют ваши параметры (либо по имени файла, либо по их содержимому). Затем, когда бы ни выполнялось задание cron, вы бы перечислили этот каталог, отсортировав файлы по времени последней модификации. Вы берете самую старую запись, touchэтот файл, чтобы изменить его время модификации на текущее время, а затем используете его для запуска скрипта.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Если вы хотите, вы также можете написать это в одной строке для cron, хотя это будет труднее читать.

Добавление параметров означает добавление новых файлов в каталог параметров. Удаление параметров означает удаление файлов. В любой момент самым старым файлом будет тот, который будет запущен следующим, поэтому новые опции будут добавлены в самом конце цикла, как если бы он только что был запущен. Если вы хотите изменить порядок вариантов, вы можете коснуться их в любом порядке.

MVG
источник
Абсолютно +1 за то, как вы управляете последовательностью опций в «редактировании списка».
Хаген фон Айтцен
Спасибо за ответ, мне это нравится и я буду им пользоваться. Точный порядок вращения не так важен, когда я добавляю новые в список. Единственное, что имеет значение, это то, что все они бегают 1-2 раза в неделю каждую неделю, а не два в один и тот же день.
Саиф Бечан
2
$(ls -rt | head -n1)конечно, будут ломаться на имена файлов, которые включают в себя новые строки, но для этой цели вы, вероятно, можете сойти с рук просто "не делай этого".
CJM
20

Допустим, вы хотите другой вариант для каждого дня недели. Вы можете:

  1. Есть отдельная работа cron для этих:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    и т.д...

  2. У вас есть bashнужные варианты:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (Я не запускал последний, так что, возможно, потребуется немного подправить - но это общая идея.)

Конрад Гаевский
источник
2
Спасибо за ответы, но я думаю, что это будет грязно. Мне действительно нужно определить массив где-нибудь, иначе он не будет работать. Я не могу работать с и echo option1т.д., потому что мои варианты могут меняться от недели к неделе. Я просто сделаю это в моем приложении Node и отследю, какой из них я запускал последним в моей БД.
Саиф Бечан
13

Нет, я не могу придумать чистого способа сделать это. Просто напишите простой сценарий оболочки-оболочки, который проверяет дату и запускает приложение узла с необходимыми опциями каждый день.

EEAA
источник
+1 ключ «нет чистого пути».
Паоло