Как создать crontab через скрипт



Мне нужно добавить задание cron через скрипт, который я запускаю, чтобы настроить сервер. В настоящее время я использую Ubuntu. Я могу использовать crontab -e но это откроет редактор для редактирования текущего crontab. Я хочу сделать это программно.

можно ли это сделать?

94   11  

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 - ожидает ввода в формате, отличном от what crontab -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 код возврата, вызывающий последующую команду (the echo) не подлежит исполнению... таким образом, 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 -
    Ничего не найдено.

Добавить ответ:
Отменить.