it-swarm.com.ru

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

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

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

105
gaurav

Задания Cron обычно хранятся в файле для каждого пользователя в /var/spool/cron

Самое простое, что вы можете сделать, это, вероятно, просто создать текстовый файл с настроенным заданием, затем скопировать его в папку спулинга cron и убедиться, что у него есть необходимые разрешения.

10
Jason Stelzer

Вот одна строка, которая не использует/не требует, чтобы новая работа была в файле:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/null важен для того, чтобы вы не получали сообщение no crontab for username, которое выдают некоторые * nixes, если в настоящее время нет записей crontab.

272
Joe Casadonte

Для пользовательских 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.

49
Dennis Williamson

В Ubuntu и многих других дистрибутивах вы можете просто поместить файл в каталог /etc/cron.d, содержащий одну строку с допустимой записью crontab . Нет необходимости добавлять строку в существующий файл.

Если вам нужно что-то запускать ежедневно, просто поместите файл в /etc/cron.daily. Кроме того, вы также можете перетащить файлы в /etc/cron.hourly, /etc/cron.monthly и /etc/cron.weekly.

25
IvanGoneKrazy

Файлы Crontab - это просто текстовые файлы, и поэтому они могут рассматриваться как любой другой текстовый файл. Цель команды crontab - сделать редактирование файлов crontab более безопасным. При редактировании с помощью этой команды файл проверяется на наличие ошибок и сохраняется только в случае его отсутствия.

crontab [path to file] может использоваться для указания crontab, хранящегося в файле. Как и crontab -e, файл будет установлен только в том случае, если он не содержит ошибок.

Поэтому сценарий может либо напрямую записывать файлы вкладок cron, либо записывать их во временный файл и загружать их с помощью команды crontab [path to temp file]. Запись напрямую избавляет от необходимости записи временного файла, но также избегает проверки безопасности.

15
cledoux

Еще более простым ответом на ваш вопрос будет:

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 расположение файла crontab по умолчанию - /var/spool/cron/. Здесь вы можете найти файлы crontab всех пользователей. Вам просто нужно добавить свою запись cronjob в файл соответствующего пользователя. В приведенном выше примере к файлу crontab пользователя root добавляется cronjob для выполнения /root/test.sh каждый день в 1:00.

12
ganesh pathak

Как исправление для тех, кто предлагает crontab -l | crontab -: это работает не на всех системах. Например, мне пришлось добавить задание в корневой crontab на десятках серверов, работающих под управлением старой версии SUSE (не спрашивайте почему). Старые SUSE добавляют строки комментариев к выводу crontab -l, что делает crontab -l | crontab - неидемпотентным (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 - он не будет работать.

3
user2845840

Ну, /etc/crontab просто файл ascii, поэтому самое простое - просто

 echo "*/15 * * * *   root     date" >> /etc/crontab

который добавит работу, которая будет отправлять вам каждые 15 минут. Настройте по вкусу и проверьте с помощью grep или другими способами, была ли добавлена ​​строка, чтобы сделать ваш скрипт идемпотентным.

В Ubuntu и др. Вы также можете удалять файлы в /etc/cron.*, что проще сделать и проверять на --- плюс вы не связываетесь с (системными) конфигурационными файлами, такими как /etc/crontab.

2
Dirk Eddelbuettel

Вот как можно изменить запись 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> -

Я понимаю, что это не то, о чем просил Гаурав, но почему бы не иметь все решения в одном месте?

1
Brian Smith

Я написал инструмент развертывания crontab на python: https://github.com/monklof/deploycron

pip install deploycron

Установить ваш crontab очень просто, это объединит crontab в существующий crontab системы.

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
1
monklof

(У меня недостаточно репутации, чтобы комментировать, поэтому я добавляю в качестве ответа: не стесняйтесь добавлять его в качестве комментария рядом с его ответом)

однострочный Джо Касадонте идеален, за исключением случаев, когда вы запускаете с 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 -
0
Faria