Как создать работу cron с помощью Bash автоматически без интерактивного редактора? - PullRequest
334 голосов
/ 18 мая 2009

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

Ответы [ 19 ]

2 голосов
/ 18 декабря 2018

Bash скрипт для добавления задания cron без интерактивного редактора. Приведенный ниже код помогает добавить cronjob с использованием файлов linux.

#!/bin/bash

cron_path=/var/spool/cron/crontabs/root

#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path

#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path
1 голос
/ 04 сентября 2017
CRON="1 2 3 4 5 /root/bin/backup.sh" 
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")

добавить параметр -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
1 голос
/ 03 июня 2017

Вот функция 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"
0 голосов
/ 25 октября 2018

Итак, в Debian, Ubuntu и многих подобных дистрибутивах на основе Debian ...

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

Вы можете поместить файл в /etc/cron.d/somefilename, где somefilename - это то, что вы хотите.

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

Давайте разберем это:

sudo - потому что вам нужны повышенные привилегии для изменения конфигураций cron в каталоге / etc

echo - средство для создания вывода на стандартный вывод. printf, cat ... тоже подойдет

"- используйте двойную кавычку в начале строки, вы профессионал

0,15,30,45 * * * * - стандартное расписание запуска cron, оно запускается каждые 15 минут

ntpdate -u time.nist.gov - фактическая команда, которую я хочу выполнить

"- потому что моим первым двойным кавычкам нужен друг, чтобы закрыть строку, выводимую

>> - двойное перенаправление добавляется вместо перезаписи *

/ etc / cron.d / vmclocksync - vmclocksync - это выбранное мной имя файла, оно находится в /etc/cron.d/


* если бы мы использовали перенаправление>, мы могли бы гарантировать, что у нас была только одна запись задачи. Но мы рискуем уничтожить любые другие правила в существующем файле. Вы можете решить для себя, является ли возможным уничтожение с> правильным или возможные дубликаты с >> для вас. В качестве альтернативы, вы можете сделать что-то замысловатое или задействованное, чтобы проверить, существует ли имя файла, есть ли в нем что-нибудь и добавляете ли вы какой-либо дубликат - но у меня есть дела, которые я не могу сделать для ты прямо сейчас.

0 голосов
/ 08 сентября 2018

Мое предпочтительное решение этого было бы:

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

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

0 голосов
/ 03 сентября 2017

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

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

  if [[ -z $1 ]] ;then
    printf " no interval specified\n"
elif [[ -z $2 ]] ;then
    printf " no command specified\n"
else
    CRONIN="/tmp/cti_tmp"
    crontab -l | grep -vw "$1 $2" > "$CRONIN"
    echo "$1 $2" >> $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

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

0 голосов
/ 18 мая 2009

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

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

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

ТОО, Андреа

0 голосов
/ 24 мая 2019
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
0 голосов
/ 14 января 2015

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

EDITOR=ed
export EDITOR

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

Обратите внимание на начальный > в этом коде означает, что клавиша возврата / ввода нажата для создания новой строки.

a означает APPEND, поэтому он не будет ничего перезаписывать.

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

w означает ЗАПИСАТЬ изменения.

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

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

crontab -l

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

EDITOR=ed
export EDITOR

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

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

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

Не проверять снова

crontab -l

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

...