Порой бывает необходимо прямо из Bash-скрипта добавить или удалить какое-нибудь задание в cron.

Ниже пара функций, которые позволяют это сделать. И если с добавлением вообще проблем не возникает:

{ crontab -l; echo '#@reboot echo BashDays >/tmp/BashDays.txt' ; } | crontab -

ИЛИ:

{ crontab -l; echo '#*/10 * * * 5 echo BashDays >>/tmp/BashDays.txt' ; } | crontab -

Можно, конечно, и так, но вдруг одинаковых заданий может быть несколько и их нужно будет как-то различать.

Всё очень просто. Просто добавь воды комментарий. Для каждой задачи задаёшь разные комменты, и тогда без проблем можно удалять задачи.

#!/bin/bash

function ADD_CRON_TASK(){
  local CRON_TASK=${1:-'#'}
  local COMMENT=${2:-$(date +%s)}
  COMMENT=${COMMENT// /_}
  { crontab -l 2>/dev/null; echo "$CRON_TASK #$COMMENT"; } | crontab -
}

function REMOVE_CRON_TASK(){
  if [[ $# -eq 0 ]]; then
    echo No comment to remove cron task >&2
    return
  fi
  COMMENT=${1// /_}
  crontab -l 2>/dev/null | sed '/#'$COMMENT'$/d' | crontab -
}

CRON_TASK='#@reboot reboot'
COMMENT="My litle joke"
ADD_CRON_TASK "$CRON_TASK" "$COMMENT"

crontab -l | tail -3

echo '###################################################'
REMOVE_CRON_TASK "$COMMENT"

crontab -l | tail -3

Если запустить программу, увидите что-то типа:

#
# m h  dom mon dow   command
# @reboot reboot #My_litle_joke
#############################
# For more information see the
#
# m h  dom mon dow   command

Видно, что программа добавила задание, вывела последние три строки crontab’а, потом разделитель.

Затем задание было удалено. Это видно по последним трём строкам.

В комментариях задания пробелы заменяются на _ для упрощения работы с sed.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Ну и на всякий пожарный напомню, что для корректной работы с cron нужно задать переменную PATH либо в crontab, либо в скрипте.

© by Tagd Tagd