Мне нужно добавить задание cron через script, который я запускаю, чтобы настроить сервер. В настоящее время я использую Ubuntu. Я могу использовать crontab -e
, но это откроет редактор для редактирования текущего crontab. Я хочу сделать это программно.
Можно ли это сделать?
Работы 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 -
Если вы изменяете или создаете crontab, вы можете управлять ими, как обычные текстовые файлы. Они хранятся в каталогах /etc/cron.d
, /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
, /etc/cron.monthly
и в файлах /etc/crontab
и /etc/anacrontab
.
echo
), я получил «crontab: ошибка использования: имя файла должно быть указано для замены». Страница руководства Cron показывает синтаксис в виде crontab [ -u user ] file
, то есть с обязательным именем файла. Есть ли какая-то хитрость, чтобы заставить его принимать данные по каналу?
stdin
. Я исправлю свой ответ.
В Ubuntu и многих других дистрибутивах вы можете просто поместить файл в каталог /etc/cron.d
, содержащий одну строку с допустимым crontab запись. Нет необходимости добавлять строку в существующий файл.
Если вам просто нужно что-то запустить каждый день, просто поместите файл в /etc/cron.daily
. Аналогично, вы также можете отбрасывать файлы в /etc/cron.hourly
, /etc/cron.monthly
и /etc/cron.weekly
.
Файлы Crontab - это просто текстовые файлы и, как таковые, можно рассматривать как любой другой текстовый файл. Цель команды crontab
- сделать редактирование файлов crontab безопаснее. При редактировании этой командой файл проверяется на наличие ошибок и сохраняется только в случае отсутствия.
crontab [path to file]
может использоваться для указания crontab, хранящегося в файле. Подобно crontab -e
, это установит файл только в том случае, если он свободен от ошибок.
Следовательно, script может либо напрямую писать файлы вкладок cron, либо записывать их во временный файл и загружать их с помощью команды crontab [path to temp file]
. Запись напрямую сохраняет необходимость записи временного файла, но также позволяет избежать проверки безопасности.
crontab [path to file]
. Это был определенно лучший вариант для меня, так как он позволяет более разборчивый код. Я использую crontab для отслеживания посылок и смены обоев рабочего стола на статус. Когда я не жду посылок, проверять их не нужно каждый час. Вот почему я хотел, чтобы скрипт автоматически редактировал частоту cron.
Еще более простой ответ на ваш вопрос:
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 час ночи.
Как исправление для тех, кто предлагает crontab -l | crontab -
: это не работает для каждой системы. Например, мне пришлось добавить задание к корневому crontab на десятках серверов, на которых установлена старая версия SUSE (не спрашивайте, почему). Старые SUSE добавляют строки комментариев к выходу crontab -l
, делая crontab -l | crontab -
non-idempotent (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
- он не будет работать.
Я написал инструмент развертывания crontab в python: https://github.com/monklof/deploycron
pip install deploycron
Установите ваш crontab очень просто, это объединит crontab в существующую систему crontab.
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
Ну /etc/crontab
просто файл ascii, поэтому проще всего просто
echo "*/15 * * * * root date" >> /etc/crontab
который добавит задание, которое будет отправлять вам по электронной почте каждые 15 минут. Откорректируйте вкус и протестируйте с помощью grep
или других средств, была ли линия уже добавлена для создания idempotent script.
В Ubuntu et al вы также можете отбрасывать файлы в /etc/cron.*
, которые проще выполнять и тестировать --- плюс вы не входите в конфигурационные файлы (системные), такие как /etc/crontab
.
crond
осуществляет мониторинг, и, безусловно, делает это на заявленной платформе OP.