Я хочу иметь возможность программно добавлять новое задание cron, как лучше всего это сделать?
Из моих исследований кажется, что я мог бы сбросить текущий crontab, а затем добавить новый, отправив его обратно в crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Есть ли способ лучше?
Ответы:
У меня это всегда хорошо получалось.
Вам следует подумать о более сложном сценарии, который может делать три вещи.
Добавить строку crontab; уверяя, что его не было. Добавлять, когда он уже существует, - плохо.
Удалите строку crontab. Возможно, только предупреждение, если его не было.
Комбинация двух вышеуказанных функций для замены строки crontab.
источник
Лучший способ, если вы работаете с правами root, - это поместить файл в /etc/cron.d
если вы используете менеджер пакетов для упаковки своего программного обеспечения, вы можете просто разместить файлы в этом каталоге, и они будут интерпретироваться так, как если бы они были crontab, но с дополнительным полем для имени пользователя, например:
Имя файла:
/etc/cron.d/per_minute
Содержание:
* * * * * root /bin/sh /home/root/script.sh
источник
/etc/cron.d/*
? Трудно понять, работает ли что-то, если нужно подождать час, чтобы проверить!В решении OP есть ошибка, это может позволить добавлять записи дважды, используйте ниже, чтобы исправить.
источник
sort
передuniq
, например:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Используйте-u
опцию наsort
.Добавить что-нибудь в cron
Чтобы удалить это из cron
надеюсь поможет кому-то
источник
2>&1 | grep -v "no crontab"
потому что, когда нет crontab, строка выводаcrontab: no crontab for...
отправляется на stderr. Нет причин записывать этот вывод, отправлять его на стандартный вывод, а затем отфильтровывать с помощью grep. Если ваша цель - избежатьcrontab: no crontab for...
вывода результатов, используйте2> /dev/null | sort....
.Если вы планируете сделать это для сценария однократного запуска, чтобы просто что-то получить, взгляните на 'at'
источник
Просто измените редактор на команду tee:
источник
Предполагая, что в вашем crontab уже есть запись, следующая команда должна работать относительно хорошо. Обратите внимание, что
$CMD
переменная предназначена только для удобства чтения. Сортировка перед фильтрацией дубликатов важна, потому чтоuniq
работает только с соседними строками.Если у вас в настоящее время пустой crontab, вы получите следующую ошибку для stderr:
Если вы хотите избежать этого, вы можете добавить немного сложности и сделать что-то вроде этого:
источник
Большинство решений здесь предназначены для добавления строк в crontab. Если вам нужен больший контроль, вы захотите иметь возможность контролировать все содержимое crontab.
Вы можете сделать это довольно элегантно с помощью трубопроводов.
Чтобы полностью переписать crontab, выполните
Это должно быть легко совместить с другими ответами, описанными здесь, например
Или, если у вас есть содержимое в файле, это еще проще
источник
Вот еще один однострочный способ, позволяющий избежать дублирования
И вот способ ответить JohnZ и избежать
no crontab for user
сообщения, или если вам нужно работать вset -eu
среде типов и ничего не может вернуть ошибку (в этом случае2>/dev/null
часть является необязательной):Или, если вы хотите разделить вещи, чтобы они были более читабельны:
Или, при желании, удалите все ссылки на your_command (например: если расписание изменилось, вы хотите, чтобы оно выполнялось только один раз). В этом случае нам больше не нужны
uniq
(добавлен бонус, сохраняется порядок вставки):источник
man crontab также полезен:
CRONTAB (1)
НАЗВАНИЕ
СИНТАКСИС
источник
Добавляя к ответу JohnZ, вот синтаксис для планирования с правами root, если вы sudoer:
источник
источник
Это позволит убедиться, что ваша команда еще не существует, перед ее добавлением.
Приветствия.
источник
При вводе стандартного вывода в
crontab
macOS мне не удалось установить новый crontab, поэтому я нашел это решение, используяtee
редактор во вспомогательной оболочке:источник
Если вы хотите, чтобы задача запускалась от имени пользователя:
Если вы хотите, чтобы задача выполнялась с правами:
и проверьте задачу (с sudo или без):
источник
также вы можете добавлять свои задачи в /etc/cron.*/
источник
Вы также можете напрямую отредактировать текстовый файл таблицы cron, но ваше решение кажется вполне приемлемым.
источник