Как я могу программно создать новое задание cron?
Я хочу, чтобы иметь возможность программно добавлять новое задание cron, каков наилучший способ сделать это?
Из моих исследований кажется, что я мог бы сбросить текущий кронтаб, а затем добавить новый, трубопровод, который возвращается в crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Есть ли лучший способ?
Ответы
Ответ 1
Мне всегда было хорошо.
Вы должны рассмотреть несколько более сложный script, который может сделать три вещи.
-
Добавить линию crontab; уверяя, что этого не существует. Добавление, когда оно уже существует, плохо.
-
Удалите линию crontab. Возможно, только предупреждение, если оно не существует.
-
Комбинация двух вышеуказанных функций для замены линии crontab.
Ответ 2
Лучший способ, если вы работаете с правами root, - удалить файл в /etc/cron.d
Если вы используете диспетчер пакетов для упаковки своего программного обеспечения, вы можете просто сложить файлы в этом каталоге, и они интерпретируются так, как если бы они были crontabs, но с дополнительным полем для имени пользователя, например:
Имя файла: /etc/cron.d/per_minute
Содержание:
* * * * * root /bin/sh /home/root/script.sh
Ответ 3
Решение OP имеет ошибку, это может позволить добавлять записи дважды, используйте ниже, чтобы исправить.
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
Ответ 4
Чтобы добавить что-нибудь в cron
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -
Чтобы удалить это из cron
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh | sort | uniq | crontab -
Надежда поможет кому-то
Ответ 5
Если вы планируете сделать это для сценария с однократным запуском, просто запустите что-нибудь, посмотрите 'at'
Ответ 6
Просто измените редактор на команду:
export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e
Ответ 7
Предполагая, что в вашем crontab уже есть запись, следующая команда должна работать относительно хорошо. Обратите внимание, что переменная $CMD
доступна только для удобства чтения. Сортировка перед фильтрацией дубликатов важна, потому что uniq
работает только на соседних строках.
CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -
Если у вас есть пустой crontab, вы получите следующую ошибку для stderr:
no crontab for user
Если вы хотите этого избежать, добавьте немного сложности, добавьте что-то вроде этого:
(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//" | sort | uniq | crontab -
Ответ 8
Большинство решений здесь - для добавления линий к crontab. Если вам нужно больше контроля, вы захотите контролировать все содержимое crontab.
Вы можете использовать трубопровод, чтобы сделать это довольно элегантно.
Чтобы полностью переписать crontab, сделайте
echo "2 2 2 2 2 /bin/echo foobar" |crontab -
Это должно быть легко сочетаться с другими ответами, описанными здесь, как
crontab -l | <something> | tee |crontab -
Или, если у вас есть содержимое в файле, оно еще проще
cat <file> |crontab -
Ответ 9
man crontab также полезен:
CRONTAB (1)
NAME
crontab - manipulate per-user crontabs (Dillon Cron)
СИНТАКСИС
crontab file [-u user] - replace crontab from file
crontab - [-u user] - replace crontab from stdin
crontab -l [user] - list crontab for user
Ответ 10
Добавление в ответ JohnZ, вот синтаксис для планирования как root, если вы являетесь sudoer:
(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -
Ответ 11
function cronjob_exists($command){
$cronjob_exists=false;
exec('crontab -l', $crontab);
if(isset($crontab)&&is_array($crontab)){
$crontab = array_flip($crontab);
if(isset($crontab[$command])){
$cronjob_exists=true;
}
}
return $cronjob_exists;
}
function append_cronjob($command){
if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){
//add job to crontab
exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);
}
return $output;
}
append_cronjob('* * * * * curl -s http://localhost/cron/test.php');
Ответ 12
Это проверит, чтобы убедиться, что ваша команда еще не существует до ее добавления.
crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -
Приветствия.
Ответ 13
Piping stdout в crontab
не установил новый crontab для меня на macOS, поэтому я нашел это решение вместо этого, используя редактор tee
в подклассе:
(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)
Ответ 14
Здесь еще один однострочный путь, который позволяет избежать дублирования
(crontab -l 2>/dev/null | fgrep -v "*/1 * * * * your_command"; echo "*/1 * * * * your_command") | crontab -
И вот способ сделать JohnZ ответить и не избегать no crontab for user
сообщения no crontab for user
, или если вам нужно работать в среде типа set -eu
и не может ничего возвращать сбой (в этом случае 2>/dev/null
часть необязательна):
( (crontab -l 2>/dev/null || echo "") ; echo "0 * * * * your_command") | sort -u - | crontab -
Или если вы хотите разбить вещи так, чтобы они были более читабельными:
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -
Или, возможно, удалите любые ссылки на вашу команду (например: если расписание изменилось, вы хотите, чтобы она когда-либо была сделана один раз). В этом случае нам больше не нужен uniq
(добавлен бонус, порядок вставки также сохраняется):
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -
Ответ 15
Чтобы добавить задачу для запуска на пользователя, в терминале выполните:
crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | crontab -
чтобы добавить задачу для запуска в корне:
sudo crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | sudo crontab -
и проверьте задание (с или без 'sudo'):
crontab -l | sed '/^$/d; /#/d'
Ответ 16
также вы можете добавить свои задачи в /etc/cron. */
Ответ 17
Вы также можете редактировать текстовый файл таблицы cron напрямую, но ваше решение кажется вполне приемлемым.