Как создать задание cron с помощью Bash автоматически без интерактивного редактора?



Answers

Вы можете сделать это на лету

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l перечисляет текущие задания crontab, cat печатает его, echo выводит новую команду и crontab - добавляет все печатные материалы в файл crontab. Вы можете увидеть эффект, выполнив новый crontab -l .

Question

У crontab есть аргумент для создания заданий cron без использования редактора (crontab -e). Если да, то каким будет код, создающий cronjob из сценария Bash?




Вот функция bash для добавления команды в crontab без дублирования

function addtocrontab () {
  local frequency=$1
  local command=$2
  local job="$frequency $command"
  cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"



Было много хороших ответов на использование crontab, но не упоминалось более простой метод, например, использование cron .

Использование cron будет использовать системные файлы и каталоги, расположенные в /etc/crontab , /etc/cron.daily,weekly,hourly , /etc/cron.daily,weekly,hourly , /etc/cron.daily,weekly,hourly или /etc/cron.d/ :

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

В приведенном выше примере мы создали файл в /etc/cron.d/ , если переменные среды для команды выполнялись успешно и предоставили user команду, а также command . Этот файл не должен быть исполняемым, и имя должно содержать только буквенно-цифровые и дефисы (подробнее см. Ниже).

Чтобы дать исчерпывающий ответ, давайте посмотрим на различия между crontab vs cron/crond :

crontab -- maintain tables for driving cron for individual users

Для тех, кто хочет выполнить задание в контексте своего пользователя в системе, использование crontab может иметь смысл.

cron -- daemon to execute scheduled commands

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

Быстрый отрывок из manpages дает вам несколько примеров того, что делать и не делать:

/ etc / crontab, а файлы в файле /etc/cron.d должны принадлежать root и не должны записываться в группу или другие. В отличие от области катушки файлы под /etc/cron.d или файлы под /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly также могут быть символических ссылок, при условии, что как символическая ссылка, так и файл, на который он указывает, принадлежат root. Файлы под /etc/cron.d не должны быть исполняемыми, в то время как файлы под /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly делают, поскольку они выполняются заготовленными частями (дополнительную информацию см. в разделе «Заготовки» (8) »).

Источник: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

Управление кронами таким образом проще и более масштабируемо с точки зрения системы, но не всегда будет лучшим решением.




Если вы используете Vixie Cron, например, в большинстве дистрибутивов Linux, вы можете просто поместить файл в /etc/cron.d с помощью отдельной cronjob.

Конечно, это работает только для корня. Если ваша система поддерживает это, вы должны увидеть несколько примеров. (Обратите внимание на имя пользователя, включенное в строку, в том же синтаксисе, что и старый / etc / crontab)

Это печальная ошибка в cron, что нет способа справиться с этим как с обычным пользователем, и что так много реализаций cron никак не могут справиться с этим.




Вариант, который редактирует только crontab, если искомая строка не найдена там:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")



Спасибо всем за вашу помощь. Объединив то, что я нашел здесь и в другом месте, я придумал следующее:

Код

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

Я не мог понять, как устранить необходимость в двух переменных без повторения.

command , очевидно, является командой, которую я хочу запланировать. job принимает $command и добавляет данные планирования. Мне нужны обе переменные отдельно в строке кода, которая выполняет эту работу.

Детали

  1. Поблагодарите duckyflip, я использую эту небольшую перенаправляемую вещь ( <(*command*) ), чтобы вывести вывод crontab -l на вход для команды fgrep .
  2. fgrep отфильтровывает любые соответствия $command ( -v option), без fgrep регистра ( -i option).
  3. Опять же, небольшое перенаправление thingy ( <(*command*) ) используется, чтобы вернуть результат на вход для команды cat .
  4. Команда cat также получает echo "$job" (самоочевидно), опять же, используя команду redirect thingy ( <(*command*) ).
  5. Таким образом, отфильтрованный вывод crontab -l и простой echo "$job" , объединенный, передаются по каналу ('|') на crontab - для окончательного написания.
  6. И все они жили долго и счастливо!

В двух словах:

Эта строка кода фильтрует любые задания cron, которые соответствуют команде, а затем записывает оставшиеся задания cron с новым, эффективно действуя как функция «добавить» или «обновить». Чтобы использовать это, все, что вам нужно сделать, это заменить значения переменных command и job .




CRON="1 2 3 4 5 /root/bin/backup.sh" 
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")

add -w параметр для grep точной команды, без параметра -w, добавление cronjob "testing" вызывает удаление задания cron "testing123"

скрипт для добавления / удаления cronjobs. нет записей дублирования:

cronjob_editor () {         
# usage: cronjob_editor '<interval>' '<command>' <add|remove>

if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi

if [[ "$3" == add ]] ;then
    # add cronjob, no duplication:
    ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
elif [[ "$3" == remove ]] ;then
    # remove cronjob:
    ( crontab -l | grep -v -F -w "$2" ) | crontab -
fi 
} 
cronjob_editor "$1" "$2" "$3"

проверено:

$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file



Links