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

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

16 ответов


вы можете добавить в crontab следующим образом:

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Cron line explaination

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

источник страницы nixcraft.


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

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

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


этот короткий не требует временного файла, он невосприимчив к нескольким вставкам и позволяет изменять расписание существующей записи.

скажите, что у вас есть это:

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

чтобы добавить его в crontab, без дублирования:

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

чтобы удалить его из crontab независимо от его текущего расписания:

( crontab -l | grep -v -F "$croncmd" ) | crontab -

Примечания:

  • grep-F соответствует строке буквально, так как мы не хотим интерпретировать ее как обычную выражение
  • мы также игнорируем планирование времени и ищем только команду. Таким образом, расписание можно изменить без риска добавления новой строки в crontab

спасибо всем за помощь. Собрав воедино все, что я нашел здесь и в других местах, я пришел к следующему выводу:--22-->

Код

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 во вход для .
  2. fgrep затем отфильтровывает любые матчи $command (), без учета регистра ().
  3. опять же, маленькая перенаправляющая штука (<(*command*)) используется, чтобы превратить результат обратно во вход для .
  4. на также получает echo "$job" (само собой разумеется), опять же, с помощью перенаправления thingy (<(*command*)).
  5. таким образом, отфильтрованный выход из crontab -l и просто echo "$job" в сочетании, передаются ('|') к crontab - наконец-то быть написано.

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

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


EDIT (исправлена перезапись):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

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

используя cron воспользуется системные файлы и каталоги, расположенные по адресу /etc/crontab, /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 для команды, и . Этот файл не должен быть исполняемым, а имя должно содержать только альфа-цифры и дефисы (подробнее ниже).

чтобы дать исчерпывающий ответ, давайте посмотрим на различия между 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.ежечасно, / etc / cron.ежедневно, /и т. д./cron.еженедельно и / etc / cron.месячные также могут быть ссылки, при условии, что оба ссылке и файл, на который он указывает, принадлежит root. Файлы в разделе /etc / cron.d не обязательно быть исполняемым, в то время как файлы под /etc/cron.ежечасно, / etc / cron.ежедневно, /и т. д./cron.еженедельно и / etc / cron.ежемесячно, так как они выполняются частями выполнения (см. run-parts(8) для получения дополнительной информации).

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

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


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

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

скорее всего, вы автоматизируете это, и вы не хотите, чтобы одно задание дважды. В этом случае:

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

это работает только если вы используете bash. Я не знаю правильного тире (sh) синтаксис.

обновление: это не работает, если у пользователя еще нет crontab. Более надежным способом было бы:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

кроме того, если ваш дистрибутив поддерживает его, вы также можете использовать отдельный файл:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

нашли те, кто в еще один вопрос.


для хорошего быстрого и грязного создания / замены crontab из скрипта BASH я использовал эту нотацию:

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

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

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

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


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

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

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

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

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

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

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

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

проверил :

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

нет, в crontab нет опции для изменения файлов cron.

вы должны: взять текущий файл cron (crontab-l > newfile), изменить его и поместить новый файл на место (crontab newfile).

Если вы знакомы с Perl, вы можете использовать этот модуль Config:: Crontab.

LLP, Andrea


функция скрипта для добавления cronjobs. проверьте повторяющиеся записи, используемые выражения * >"

cronjob_creator () {         
# usage: cronjob_creator '<interval>' '<command>'

  if [[ -z  ]] ;then
    printf " no interval specified\n"
elif [[ -z  ]] ;then
    printf " no command specified\n"
else
    CRONIN="/tmp/cti_tmp"
    crontab -l | grep -vw " " > "$CRONIN"
    echo " " >> $CRONIN
    crontab "$CRONIN"
    rm $CRONIN
fi
}

проверил :

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

Источник : мой мозг ;)


моим предпочтительным решением для этого было бы следующее:

(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -

Это позволит убедиться, что вы правильно обрабатываете пустую новую строку внизу. Чтобы избежать проблем с crontab, вы обычно должны закончить файл crontab пустой новой строкой. И сценарий выше гарантирует, что он сначала удаляет любые пустые строки с " grep ."часть, а затем добавьте новую пустую строку в конце с "\n" в конце сценария. Это также предотвратит получение пустой строки над вашей новой командой, если существующий файл crontab заканчивается пустой строкой.


вероятно, вы можете изменить редактор по умолчанию на ed и использовать heredoc для редактирования.

EDITOR=ed
export EDITOR

crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF

Примечание ведущего > в этом коде означает, что клавиша return / enter нажата для создания новой строки.

на a означает добавление, поэтому он ничего не перезапишет.

на . означает, что вы закончили редактирование.

на w средства пишут изменение.

на q означает выход или выход из ed.

вы можете проверить это

crontab -l

вы также можете удалить запись.

EDITOR=ed
export EDITOR

crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF

это удалит запись crontab с Myscript в нем.

на d означает удаление шаблона внутри //.

нет проверьте это еще раз

crontab -l

это решение работает внутри скрипта слишком меньше > конечно :-)