Как создать crontab через скрипт
Мне нужно добавить задание cron через скрипт, который я запускаю, чтобы настроить сервер. В настоящее время я использую Ubuntu. Я могу использовать crontab -e но это откроет редактор для редактирования текущего crontab. Я хочу сделать это программно.
можно ли это сделать?
11 ответов:
хрон рабочих мест, как правило, сохраняются в файл на уровне пользователя
/var/spool/cronсамое простое, что вам нужно сделать, это, вероятно, просто создать текстовый файл с настроенным заданием, а затем скопировать его в папку cron spool и убедиться, что у него есть правильные разрешения.
вот один лайнер, который не использует / требует, чтобы новое задание было в файле:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -The
2>/dev/nullважно, чтобы вы не получилиno crontab for usernameсообщение, что некоторые *никсы производят, если в настоящее время нет записей 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 -если вы изменяете или создаете системные кронтабы, ими можно манипулировать так же, как и вы обычный текстовый файл. Они хранятся в
/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 корневого пользователя добавляется с cronjob для запуска/root/test.shкаждый день в 1 час ночи.
как поправка к тем, кто предлагает
crontab -l | crontab -: Это не работает на всех системах. Например, мне пришлось добавить задание в корневой crontab на десятках серверов под управлением старой версии SUSE (не спрашивайте почему). Старые Сузы добавляют строки комментариев к выходуcrontab -l, сделавcrontab -l | crontab -неидемпотентный (Debian распознает эту проблему на странице руководства crontab и исправляет свою версию Vixie Cron, чтобы изменить поведение по умолчаниюcrontab -l).для программного редактирования кронтабов системы где
crontab -lдобавляет комментарии, Вы можете попробовать следующее:
EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=catговорит crontab, чтобы использоватьcatкак редактор (не обычный vi по умолчанию), который не изменяет файл, а вместо этого копирует его в stdout. Это все равно может не сработать, еслиcrontab -ожидает ввода в формате, отличном от whatcrontab -eвыходов. Не пытайтесь заменить финалcrontab -Сcrontab -e- это не сработает.
хорошо
/etc/crontabпросто ascii-файл, поэтому проще всего простоecho "*/15 * * * * root date" >> /etc/crontab, который добавит работу, которая будет Вам по электронной почте каждые 15 минут. Отрегулируйте по вкусу, и тест через
grepили другое означает, была ли строка уже добавлена, чтобы сделать ваш скрипт идемпотентным.на Ubuntu et al, вы также можете удалить файлы в
/etc/cron.*что проще сделать и проверить для - - - плюс вы не связываетесь с (системными) файлами конфигурации, такими как/etc/crontab.
Я написал инструмент развертывания crontab в 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> -Я понимаю, что это не то, что Гаурав спрашивал, но почему бы не иметь все решения в одном месте?
(у меня недостаточно репутации для комментариев, поэтому я добавляю в качестве ответа: не стесняйтесь добавлять его как комментарий рядом с его ответом)
Джо Касадонте один лайнер идеально, за исключением того, если вы работаете с
set -e, т. е. если ваш скрипт настроен на сбой при ошибке, и если еще нет cronjobs. В этом случае один лайнер не будет создавать cronjob, но и не остановит скрипт. Молчаливая неудача может ввести в заблуждение.в причина в том, что
crontab -lС1код возврата, вызывающий последующую команду (theecho) не подлежит исполнению... таким образом, cronjob не создается. Но поскольку они выполняются как подпроцесс (из-за скобок), они не останавливают сценарий.(интересно, что если вы снова запустите ту же команду, она будет работать: после того, как вы выполнили
crontab -раз,crontab -lпо-прежнему ничего не выводит, но он больше не возвращает ошибку (вы не получаетеno crontab for <user>сообщение больше.) Так что последующийechoвыполняется и создается кронтаб)в любом случае, если вы бежите с
set -e, строка должна быть:(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -
Comments