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

85

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

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

Показать ещё 1 комментарий
Теги:
cron
crontab

9 ответов

8
Лучший ответ

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

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

  • 18
    Изменение файлов непосредственно в / var / spool / cron не одобряется. На самом деле, если вы посмотрите на файлы там, они обычно содержат предупреждения, такие как «НЕ РЕДАКТИРОВАТЬ ЭТОТ ФАЙЛ» в качестве первой строки.
  • 9
    @Jared Хотя я вполне согласен с этой идеей, сказать, что она "осуждается", не очень помогает. Скорее сообщите, какой другой файл следует редактировать, если таковые имеются, или объясните риски редактирования файлов вручную. Я планирую создать несколько заданий cron через автоматизированную командную строку, и если редактирование этого файла является единственной возможностью и без значительных побочных эффектов, я не понимаю, почему мне не следует его использовать.
Показать ещё 3 комментария
200

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

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

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

  • 11
    Это должен быть принятый ответ. Просто сейчас нужен способ проверить, есть ли однострочник, который я собираюсь добавить, уже есть или нет ...
  • 7
    ... о, подождите, вот как проверить, есть ли что-то в crontab моего пользователя, прежде чем я добавлю это с помощью скрипта: stackoverflow.com/a/14451184/3686125
Показать ещё 2 комментария
40

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

  • 0
    Выглядело многообещающе, но попробовав второй подход (с echo ), я получил «crontab: ошибка использования: имя файла должно быть указано для замены». Страница руководства Cron показывает синтаксис в виде crontab [ -u user ] file , то есть с обязательным именем файла. Есть ли какая-то хитрость, чтобы заставить его принимать данные по каналу?
  • 1
    @MarkBerry: К сожалению об этом. В трубе, дефис должен использоваться, чтобы указать, что ввод от stdin . Я исправлю свой ответ.
19

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

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

  • 5
    Но вы должны быть root, чтобы сделать это.
12

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

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

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

  • 0
    Для таких нубов, как я, обратите внимание, что это crontab [path to file] . Это был определенно лучший вариант для меня, так как он позволяет более разборчивый код. Я использую crontab для отслеживания посылок и смены обоев рабочего стола на статус. Когда я не жду посылок, проверять их не нужно каждый час. Вот почему я хотел, чтобы скрипт автоматически редактировал частоту cron.
  • 0
    @Rasmus Это звучит как потрясающий сценарий, который я бы хотел украсть. Есть ли шанс поделиться через гист или подобное?
9

Еще более простой ответ на ваш вопрос:

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 час ночи.

  • 1
    это самый простой ответ, спасибо!
2

Как исправление для тех, кто предлагает 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 - он не будет работать.

1

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

pip install deploycron

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

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

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

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

который добавит задание, которое будет отправлять вам по электронной почте каждые 15 минут. Откорректируйте вкус и протестируйте с помощью grep или других средств, была ли линия уже добавлена ​​для создания idempotent script.

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

  • 1
    Я думаю, что технически crond не требуется для отслеживания изменений в crontab, даже если в действительности большинство реализаций делают это, поэтому я рекомендовал бы после этого вызвать crontab -e, чтобы подтолкнуть его. crontab -e учитывает переменную EDITOR, если память не изменяет, поэтому на момент ее установки / bin / true следует просто перечитать crontab.
  • 1
    Правда, в любой недавней системе Linux crond осуществляет мониторинг, и, безусловно, делает это на заявленной платформе OP.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню