Как я могу программно создать новую работу cron? - PullRequest
115 голосов
/ 04 марта 2009

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

Из моего исследования кажется, что я могу сбросить текущий crontab, а затем добавить новый, отправив его обратно в crontab:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

Есть ли лучший способ?

Ответы [ 16 ]

113 голосов
/ 04 марта 2009

Лучший способ, если вы работаете от имени пользователя root, это поместить файл в /etc/cron.d

.

если вы используете менеджер пакетов для упаковки вашего программного обеспечения, вы можете просто положить файлы в этот каталог, и они будут интерпретироваться, как если бы они были crontabs, но с дополнительным полем для имени пользователя, например:

Имя файла: /etc/cron.d/per_minute

Содержание: * * * * * root /bin/sh /home/root/script.sh

85 голосов
/ 13 ноября 2012

В решении OP есть ошибка, она может позволить дважды добавлять записи, используйте ниже для исправления.

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
21 голосов
/ 22 июля 2014

Добавить что-то в 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 -

надеюсь, поможет кому-то

6 голосов
/ 17 июня 2014

Просто измените редактор на команду:

export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e
6 голосов
/ 04 марта 2009

Если вы планируете сделать это для сценария однократного запуска, просто чтобы что-то сделать, взгляните на 'на'

4 голосов
/ 31 июля 2013

Предполагая, что в вашем 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 -
2 голосов
/ 13 июня 2018

Большинство решений здесь для добавления строк в crontab. Если вам нужно больше контроля, вы захотите иметь возможность контролировать все содержимое crontab.

Вы можете использовать трубопровод, чтобы сделать это довольно элегантно.

Чтобы полностью переписать crontab, выполните

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

Это должно быть легко совмещено с другими ответами, описанными здесь как

crontab -l | <something> | tee |crontab -

Или, если у вас есть содержимое в файле, это еще проще

cat <file> |crontab -
2 голосов
/ 24 июля 2015

В дополнение к ответу JohnZ, вот синтаксис для назначения от имени root, если вы sudoer:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -
2 голосов
/ 06 марта 2009

man crontab также полезен:

CRONTAB (1)

ИМЯ

   crontab - manipulate per-user crontabs (Dillon's Cron)

СИНТАКСИС

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user
1 голос
/ 11 ноября 2016

Это проверит, чтобы убедиться, что ваша команда еще не существует, прежде чем добавить ее.

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...