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

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

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

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

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

Ответы [ 16 ]

1 голос
/ 14 июля 2014
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');
0 голосов
/ 17 апреля 2018

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

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

И вот способ сделать ответ JohnZ и избежать сообщения 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 -

Или, при желании, удалите все ссылки на your_command (например: если расписание изменилось, вы хотите, чтобы оно когда-либо использовалось только один раз). В этом случае нам больше не нужно 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 -
0 голосов
/ 19 августа 2017

Передача стандартного вывода в crontab не установила для меня новый crontab на macOS, поэтому я нашел это решение, используя редактор tee в под-оболочке:

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)
0 голосов
/ 06 марта 2009

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

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

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

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

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

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

  3. Сочетание двух вышеупомянутых функций для замены строки crontab.

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

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

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