Как мне создать crontab через скрипт - PullRequest
123 голосов
/ 03 февраля 2011

Мне нужно добавить задание cron через скрипт, который я запускаю для настройки сервера. Я в настоящее время использую Ubuntu. Я могу использовать crontab -e, но при этом откроется редактор для редактирования текущего crontab. Я хочу сделать это программно.

Возможно ли это сделать?

Ответы [ 12 ]

297 голосов
/ 09 марта 2012

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

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

The 2>/dev/null Важно, чтобы вы не получите no crontab for username сообщение, что некоторые * nixes производства, если в настоящее время нет записей Crontab.

53 голосов
/ 03 февраля 2011

Для пользовательских crontabs (включая root) вы можете сделать что-то вроде:

crontab -l -u user | cat - filename | crontab -u user -

, где файл с именем "filename" содержит элементы для добавления.Вы также можете выполнять манипуляции с текстом, используя sed или другой инструмент вместо cat.Вы должны использовать команду crontab вместо прямого изменения файла.

Аналогичная операция будет выглядеть так:

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

Если вы изменяете или создаете системные crontabs, ими можно манипулировать какВы бы обычные текстовые файлы.Они хранятся в каталогах /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly и в файлах /etc/crontab и /etc/anacrontab.

26 голосов
/ 03 февраля 2011

В Ubuntu и многих других дистрибутивах вы можете просто поместить файл в каталог /etc/cron.d, содержащий одну строку с допустимой записью crontab . Нет необходимости добавлять строку в существующий файл.

Если вам просто нужно что-то запускать ежедневно, просто поместите файл в /etc/cron.daily. Кроме того, вы также можете перетащить файлы в /etc/cron.hourly, /etc/cron.monthly и /etc/cron.weekly.

16 голосов
/ 03 февраля 2011

Файлы Crontab - это просто текстовые файлы, поэтому их можно рассматривать как любой другой текстовый файл.Цель команды crontab - сделать редактирование файлов crontab более безопасным.При редактировании с помощью этой команды файл проверяется на наличие ошибок и сохраняется только при его отсутствии.

crontab [path to file] можно использовать для указания файла crontab, хранящегося в файле.Как и crontab -e, файл будет установлен только в том случае, если он не содержит ошибок.

Поэтому скрипт может либо напрямую записывать файлы вкладок cron, либо записывать их во временный файл и загружать их с помощью crontab [path to temp file]команда.Запись напрямую избавляет от необходимости записи временного файла, но также избегает проверки безопасности.

15 голосов
/ 30 января 2015

Еще более простой ответ на ваш вопрос будет:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

Вы можете настроить cronjobs на удаленных серверах, как показано ниже:

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

В Linux расположение файла crontab по умолчанию - /var/spool/cron/. Здесь вы можете найти файлы crontab всех пользователей. Вам просто нужно добавить свою запись cronjob в файл соответствующего пользователя. В приведенном выше примере к файлу crontab пользователя root добавляется cronjob для выполнения /root/test.sh каждый день в 1:00.

11 голосов
/ 03 февраля 2011

Задания Cron обычно хранятся в файле для каждого пользователя в папке /var/spool/cron

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

6 голосов
/ 16 января 2015

Как исправление к тем, кто предлагает crontab -l | crontab -: Это работает не на всех системах. Например, мне пришлось добавить задание в корневой crontab на десятках серверов, работающих под старой версией SUSE (не спрашивайте почему). Старые SUSE добавляют строки комментариев к выводу crontab -l, что делает crontab -l | crontab - неидемпотентным (Debian распознал эту проблему на man-странице crontab и исправил свою версию Vixie Cron для изменения поведения по умолчанию crontab -l).

Чтобы редактировать crontabs программно в системах, где crontab -l добавляет комментарии, вы можете попробовать следующее:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=cat говорит crontab использовать cat в качестве редактора (не обычного по умолчанию vi), который не изменяет файл, а вместо этого копирует его в стандартный вывод. Это может все еще потерпеть неудачу, если crontab - ожидает ввод в формате, отличном от того, что выводит crontab -e. Не пытайтесь заменить окончательный crontab - на crontab -e - он не будет работать.

4 голосов
/ 24 июля 2018

(у меня недостаточно репутации, чтобы комментировать, поэтому я добавляю в качестве ответа: не стесняйтесь добавлять его в качестве комментария рядом с его ответом)

Однострочная строка Джо Касадонте идеальна, за исключением случаев, когда вы запускаете с set -e, т.е. если ваш скрипт настроен на ошибку при ошибке, и если еще нет cronjobs.В этом случае однострочник НЕ создаст cronjob, но НЕ остановит скрипт.Тихая ошибка может быть очень обманчивой.

Причина в том, что crontab -l возвращается с кодом возврата 1, в результате чего последующая команда (echo) не будет выполнена ... таким образом, cronjobне создан.Но так как они выполняются как подпроцесс (из-за круглых скобок), они не останавливают сценарий.

(Интересно, что если вы снова запустите ту же команду, она будет работать: после выполнения crontab -один раз crontab -l все еще ничего не выводит, но больше не возвращает ошибку (вы больше не получаете сообщение no crontab for <user>). Таким образом, выполняется следующий echo и создается crontab)

В любом случае, если вы запускаете с set -e, строка должна быть:

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
2 голосов
/ 09 марта 2018

Вот как изменить запись cron без непосредственного редактирования файла cron (который осуждается).

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

Если вы хотите удалить запись cron, используйте это:

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

Я понимаю, что это не то, о чем просил Гаурав, но почему бы не иметь все решения в одном месте?

2 голосов
/ 03 февраля 2011

Ну /etc/crontab просто файл ascii, поэтому самое простое - просто

 echo "*/15 * * * *   root     date" >> /etc/crontab

, который добавит работу, которая будет отправлять вам каждые 15 минут.Отрегулируйте по вкусу и проверьте с помощью grep или другими способами, была ли уже добавлена ​​строка, чтобы сделать ваш скрипт идемпотентным.

В Ubuntu и др. Вы также можете удалять файлы в /etc/cron.*, что прощеи проверьте --- плюс вы не связываетесь с (системными) конфигурационными файлами, такими как /etc/crontab.

...