2009-03-04 2 views
93

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

От my research, мне кажется, я мог бы сбросить текущий кронтаб, а затем добавить новый, трубопровод, который обратно в кронтаб:

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

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

+1

Ваше решение кажется хорошим. –

+0

На Solaris просто удалите тире для последнего crontab. Вы можете добавить grep, чтобы не добавлять строку уже там. – lacroix1547

+0

Возможный дубликат [Как создать задание cron с использованием Bash] (https://stackoverflow.com/questions/878600/how-to-create-a-cron-job-using-bash) –

ответ

-5

Он всегда работал хорошо для меня.

Вы должны рассмотреть несколько более сложный сценарий, который может сделать три вещи.

  1. Добавить линию кронтабана; уверяя, что этого не существует. Добавление, когда оно уже существует, плохо.

  2. Удалить линию кронтаба. Возможно, только предупреждение, если оно не существует.

  3. Комбинация двух вышеуказанных функций для замены линии кронтаба.

+64

Он спрашивает, как и ты ему скажешь что? – Cerin

+3

@Cerin: То, что опубликованное решение сработало хорошо для меня. –

+0

Что делать, если у пользователя еще нет crontab? –

-2

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

+0

Я бы назвал это из-за опасений возможности одновременных изменений, приводящих к повреждению файлов. Использование командной строки crontab-команда должна избегать этой проблемы. –

+0

Крейг, без дополнительных исследований, я не был бы уверен, что версия командной строки является атомарной и безопасной для гонки. Наверное, «совершенно безопасно». – tuomassalo

+0

«Редактирование файла напрямую» невозможно без доступа root (при условии, что вы можете выяснить, где находится файл crontab пользователя, и как убедиться, что демон cron правильно принимает ваши изменения), а «редактирование» программно похоже на то, что вопрос требует совета в первую очередь. – tripleee

92

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

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

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

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

+3

Просто убедитесь, что версия используемого cron поддерживает /etc/cron.d/. Большинство современных дистрибутивов Linux. – sleske

+0

Я думаю, что cron.d - патч Redhat. Это, однако, очень распространенный, из-за того, что он настолько полезен для упаковки. – MarkR

+5

Это самое простое и элегантное решение. Конечно, биты должны анализировать и редактировать существующий crontab с другими несвязанными записями. – Cerin

7

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

-1

также вы можете добавить свои задачи /etc/cron.*/

+1

-1: Ответ предоставлен уже –

1

человек кронтаб также полезен:

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 
+10

-1: Конечно, но никак не ответ на вопрос –

+3

Часть, которая говорит «заменить crontab от stdin», на самом деле является половиной ответа :-) – Grodriguez

68

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

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab - 
+1

Было бы полезно, если бы вы описали ошибка. –

+2

Это действительно лучшее, если не описано решение. Это гарантирует, что команда не добавляется дважды к crontab. – Bufke

+6

+1 для использования uniq –

3

Предполагая, что в вашем кронтабе уже есть запись, следующая команда должна работать относительно хорошо. Обратите внимание, что переменная $CMD доступна только для удобства чтения. Сортировка перед фильтрацией дубликатов важна, потому что uniq работает только на соседних линиях.

CMD='wget -O - -q http://www.example.com/cron.php"' 
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab - 

Если у Вас есть пустой кронтаб, вы получите следующее сообщение об ошибке в стандартный поток ошибок:

no crontab for user 

Если вы хотите, чтобы избежать этого, вы можете добавить немного сложности добавить что-то вроде это:

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//" | sort | uniq | crontab - 
+2

Я думаю, что этот случай можно поймать с помощью: (crontab -l 2>/dev/null; echo ... – ddoxey

4

Просто измените редактор для команды тройник:

export EDITOR = "tee"

echo "0 * * * */bin/echo 'Hello World'" | кронтаб -e

1
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'); 
20

Чтобы добавить что-то хрон

(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 - 

надежда поможет кому-то

+0

Это именно то, что я искал Я бы просто добавил это: | grep -v '^ #' |, чтобы отфильтровать комментарии – Tjunkie

+0

Это замечательно, ура! –

+1

На самом деле вам не нужно '2> & 1 | grep -v" no crontab "', потому что когда нет crontab, выходная строка 'crontab: no crontab for ...' отправляется в stderr. Нет причин для захвата этого вывода, отправки его на stdout и затем его фильтрации с помощью grep. Если ваша цель - избегать видя 'crontab: no crontab for ...' в вашем выводе, затем используйте '2>/dev/null | sort ....'. – matty

2

Добавление ответа JohnZ, вот это синтаксис для планирования как root, если вы являетесь sudoer:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab - 
0

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

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

Cheers.

0

Piping стандартный вывод в crontab не установить новый кронтаб для меня на MacOS, так что я нашел это решение вместо этого, с помощью tee редактора в подкаталоге оболочке:

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh") | uniq - | crontab -e)