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