Как создать 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 -"