Как создать crontab с помощью скрипта
Мне нужно добавить задание cron через скрипт, который я запускаю, чтобы настроить сервер. В настоящее время я использую Ubuntu. Я могу использовать crontab -e
но это откроет редактор для редактирования текущей кронтаб. Я хочу сделать это программно.
возможно ли это сделать?
11 ответов
задания Cron обычно хранятся в файле для каждого пользователя в разделе /var/spool/cron
самое простое, что вам нужно сделать, это, вероятно, просто создать текстовый файл с настроенным заданием, а затем скопировать его в папку cron spool и убедиться, что у него есть правильные разрешения.
вот однострочный, который не использует / требует, чтобы новое задание было в файле:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
на 2>/dev/null
важно, чтобы вы не получили no crontab for username
сообщение, которое некоторые * nixes производят, если в настоящее время нет записей crontab.
для пользователя 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
.
в Ubuntu и многих других дистрибутивах вы можете просто поместить файл в /etc/cron.d
каталог, содержащий одну строку с допустимым кронтаб запись. Нет необходимости добавлять строку в существующий файл.
Если вам просто нужно что-то запускать ежедневно, просто поместите файл в /etc/cron.daily
. Аналогично, вы также можете удалить файлы в /etc/cron.hourly
, /etc/cron.monthly
и /etc/cron.weekly
.
Crontab файлы просто текстовые файлы и как таковые могут рассматриваться как любой другой текстовый файл. Цель crontab
команда - сделать редактирование файлов crontab более безопасным. При редактировании с помощью этой команды файл проверяется на наличие ошибок и сохраняется только при их отсутствии.
crontab [path to file]
можно использовать для указания crontab, хранящегося в файле. Как crontab -e
, это установит только файл, если он не содержит ошибок.
таким образом, скрипт может либо напрямую написать вкладку cron файлы, или записать их во временный файл и загрузить их с помощью . Запись напрямую экономит необходимость записи временного файла, но также позволяет избежать проверки безопасности.
еще более простым ответом на ваш вопрос будет:
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, расположение по умолчанию и /var/spool/cron/
. Здесь вы можете найти crontab
файлы всех пользователей. Вам просто нужно добавить запись cronjob в файл соответствующего пользователя. В приведенном выше примере файл crontab пользователя root добавляется с помощью cronjob для запуска /root/test.sh
каждый день в 1 час ночи.
в качестве исправления к тем, кто предлагает crontab -l | crontab -
: Это не работает на всех системах. Например, мне пришлось добавить задание в корневую crontab на десятках серверов под управлением старой версии SUSE (не спрашивайте почему). Старые SUSEs добавляют строки комментариев к выходу crontab -l
, сделав crontab -l | crontab -
non-idempotent (Debian распознает эту проблему в manpage 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 по умолчанию), который не изменяет файл, а вместо этого копирует его в stdout. Это все еще может потерпеть неудачу, если crontab -
ожидает ввода в формате, отличном от того, что crontab -e
выходов. Не пытайтесь заменить final crontab -
С crontab -e
- это не сработает.
хорошо /etc/crontab
просто файл ascii, поэтому самый простой-просто
echo "*/15 * * * * root date" >> /etc/crontab
, который добавит работу, которая будет Вам по электронной почте каждые 15 минут. Отрегулируйте по вкусу и протестируйте через grep
или другое означает, была ли строка уже добавлена, чтобы сделать ваш скрипт идемпотентным.
на Ubuntu et al, вы также можете удалить файлы в /etc/cron.*
что проще сделать и протестировать для - - - плюс вы не связываетесь с (системными) конфигурационными файлами, такими как /etc/crontab
.
Я написал crontab deploy tool в python:https://github.com/monklof/deploycron
pip install deploycron
установить crontab очень легко, это объединит crontab в существующий crontab системы.
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
вот как изменить 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> -
Я понимаю, что это не то, о чем просил Гаурав, но почему бы не иметь все решения в одном месте?
(у меня недостаточно репутации для комментариев, поэтому я добавляю в качестве ответа: не стесняйтесь добавлять его как комментарий рядом с его ответом)
Джо Casadonte один-лайнер идеально, за исключением того, если вы работаете с 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 -