Как создать crontab через script
Мне нужно добавить задание cron через script, который я запускаю, чтобы настроить сервер. В настоящее время я использую Ubuntu. Я могу использовать crontab -e
, но это откроет редактор для редактирования текущего crontab. Я хочу сделать это программно.
Можно ли это сделать?
Ответы
Ответ 1
Задания Cron обычно хранятся в пользовательском файле в /var/spool/cron
Самое простое, что вы можете сделать, это, вероятно, просто создать текстовый файл с настроенным заданием, затем скопировать его в папку спулинга cron и убедиться, что у него есть необходимые разрешения.
Ответ 2
Здесь однострочный, который не использует/требует, чтобы новое задание находилось в файле:
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
2>/dev/null
важно, чтобы вы не получили сообщение no crontab for username
о том, что некоторые * nixes производят, если в настоящее время нет записей crontab.
Ответ 3
Для пользователя 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 -
Если вы изменяете или создаете crontab, вы можете управлять ими, как обычные текстовые файлы. Они хранятся в каталогах /etc/cron.d
, /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
, /etc/cron.monthly
и в файлах /etc/crontab
и /etc/anacrontab
.
Ответ 4
В Ubuntu и многих других дистрибутивах вы можете просто поместить файл в каталог /etc/cron.d
, содержащий одну строку с допустимым crontab запись. Нет необходимости добавлять строку в существующий файл.
Если вам просто нужно что-то запустить каждый день, просто поместите файл в /etc/cron.daily
. Аналогично, вы также можете отбрасывать файлы в /etc/cron.hourly
, /etc/cron.monthly
и /etc/cron.weekly
.
Ответ 5
Файлы Crontab - это просто текстовые файлы и, как таковые, можно рассматривать как любой другой текстовый файл. Цель команды crontab
- сделать редактирование файлов crontab безопаснее. При редактировании этой командой файл проверяется на наличие ошибок и сохраняется только в случае отсутствия.
crontab [path to file]
может использоваться для указания crontab, хранящегося в файле. Подобно crontab -e
, это установит файл только в том случае, если он свободен от ошибок.
Следовательно, script может либо напрямую писать файлы вкладок cron, либо записывать их во временный файл и загружать их с помощью команды crontab [path to temp file]
. Запись напрямую сохраняет необходимость записи временного файла, но также позволяет избежать проверки безопасности.
Ответ 6
Еще более простой ответ на ваш вопрос:
echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root
Вы можете настроить cronjob на удаленных серверах, как показано ниже:
#!/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 добавляется с помощью cronjob для запуска /root/test.sh
каждый день в 1 час ночи.
Ответ 7
Как исправление для тех, кто предлагает crontab -l | crontab -
crontab -l | crontab -
: это работает не на всех системах. Например, мне пришлось добавить задание в корневой crontab на десятках серверов, работающих под старой версией SUSE (не спрашивайте почему). Старые SUSE добавляют строки комментариев к выводу crontab -l
, делая crontab -l | crontab -
crontab -l | crontab -
неидемпотентный (Debian распознает эту проблему в справочной странице crontab и исправил свою версию Vixie Cron, чтобы изменить поведение crontab -l
по умолчанию 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
- он не будет работать.
Ответ 8
(У меня недостаточно репутации, чтобы комментировать, поэтому я добавляю в качестве ответа: не стесняйтесь добавлять его в качестве комментария рядом с его ответом)
Joe Casadonte one -l iner идеально подходит, за исключением случаев, когда вы запускаете с set -e
, т.е. если ваш скрипт настроен на ошибку при ошибке, и если еще нет cronjobs. В этом случае один инер -l НЕ будет создавать 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 -
Ответ 9
Ну /etc/crontab
просто файл ascii, поэтому проще всего просто
echo "*/15 * * * * root date" >> /etc/crontab
который добавит задание, которое будет отправлять вам по электронной почте каждые 15 минут. Откорректируйте вкус и протестируйте с помощью grep
или других средств, была ли линия уже добавлена для создания idempotent script.
В Ubuntu et al вы также можете отбрасывать файлы в /etc/cron.*
, которые проще выполнять и тестировать --- плюс вы не входите в конфигурационные файлы (системные), такие как /etc/crontab
.
Ответ 10
Вот как можно изменить запись 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> -
Я понимаю, что это не то, о чем просил Гаурав, но почему бы не иметь все решения в одном месте?
Ответ 11
Я написал инструмент развертывания crontab в python: https://github.com/monklof/deploycron
pip install deploycron
Установите ваш crontab очень просто, это объединит crontab в существующую систему crontab.
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
Ответ 12
Это подход для постепенного добавления задания cron:
ssh [email protected]$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"