Чи має crontab аргумент для створення завдань cron без використання редактора (crontab -e). Якщо так, то який би код створив cronjob із сценарію Bash?
Чи має crontab аргумент для створення завдань cron без використання редактора (crontab -e). Якщо так, то який би код створив cronjob із сценарію Bash?
Відповіді:
Ви можете додати до 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
* * * * * "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 ; echo "00 09 * * 1-5 echo hello") | crontab -
- простіше скопіювати
;
з &&
як безпечним стережіться випадку , якщо crontab -l
не вдається. так, як:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
виходить з ладу, якщо немає кронтабуляції, тому використання &&
сценарію неможливо додати перший запис до crontab.
Ви можете зробити це на ходу
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
crontab -l
перелічує поточні завдання crontab, cat
друкує його, echo
друкує нову команду та crontab -
додає всі надруковані речі у файл crontab. Ви можете побачити ефект, зробивши новий crontab -l
.
crontab -l
перелічує поточні завдання crontab, cat
друкує його, echo
друкує нову команду та crontab -
додає всі надруковані речі у файл crontab. Ви можете побачити ефект, роблячи новийcrontab -l
no crontab for <username>
, але він все одно працює.
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
працює.
Цей коротший не вимагає тимчасового файлу, він не захищений від кількох вставок, і він дозволяє змінювати графік існуючого запису.
Скажіть, у вас це:
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 -
Примітки:
Дякую всім за допомогу. Склавши разом те, що я знайшов тут і в інших місцях, я придумав це:
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
та додає дані планування. Мені були потрібні обидві змінні окремо в рядку коду, який робить роботу.
<(*command*)
), щоб перетворити висновок crontab -l
вхід для fgrep
команди.fgrep
потім фільтрує будь-які збіги $command
( -v
опція), нечутливі до регістру ( -i
опція).<(*command*)
) використовується для повернення результату назад у вхід для cat
команди.cat
Команда також отримує echo "$job"
(Пояснень), знову - таки, за рахунок використання редиректу штуковина ( <(*command*)
).crontab -l
та простий echo "$job"
, комбінований, переносяться ('|'), crontab -
щоб остаточно записати.Цей рядок коду фільтрує будь-які завдання cron, які відповідають команді, а потім виписує залишки cron з новим, ефективно діючи як функція "add" або "update". Щоб використати це, все, що вам потрібно зробити, це поміняти місцями значення змінних command
та job
змінних.
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
EDIT (фіксований перезапис):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
crontab -l
не вдасться, але 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
команду і command
саму. Цей файл не повинен бути виконаним, а ім'я має містити лише буквено-цифрові знаки та дефіси (детальніше нижче).
Щоб дати ґрунтовну відповідь, давайте розглянемо відмінності між crontab
vs cron/crond
:
crontab -- maintain tables for driving cron for individual users
Для тих, хто хоче виконати завдання в контексті свого користувача в системі, використання crontab
може мати ідеальний сенс.
cron -- daemon to execute scheduled commands
Для тих, хто використовує управління конфігурацією або хоче керувати роботами для інших користувачів, і в такому випадку ми повинні їх використовувати cron
.
Швидкий уривок із рукописів дає кілька прикладів того, що робити, а що не робити:
/ 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
Керувати кронами таким чином простіше і масштабніше з точки зору системи, але не завжди буде найкращим рішенням.
<job>
не повинно містити розширення файлу.
Швидше за все, ви це автоматизуєте, і вам не потрібно, щоб жодна робота була додана двічі. У такому випадку використовуйте:
__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")
Це працює лише якщо ви використовуєте BASH. Мені невідомий правильний sh
синтаксис DASH ( ).
Оновлення: це не працює, якщо користувач ще не має кронт-вкладки. Більш надійним способом було б:
(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
Знайшли їх в іншому питанні .
sh: 1: Syntax error: "(" unexpected
використовую ш .
<
і (
. Це означає, що < (
не вдається, але <(
працює, якщо у вашому графіку немає зірочок ...
cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Варіант, який редагує crontab лише у тому випадку, якщо потрібна рядок там не знайдена:
CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
Якщо ви використовуєте Vixie Cron, наприклад, для більшості дистрибутивів Linux, ви можете просто помістити файл у /etc/cron.d з окремою cronjob.
Це працює тільки для кореня. Якщо ваша система підтримує це, ви повинні побачити кілька прикладів там. (Зверніть увагу на ім’я користувача, що входить у рядок, у тому ж синтаксисі, що і старий / etc / crontab)
Сумно недомовленість в cron, що немає можливості впоратися з цим як звичайний користувач, і що так багато реалізацій cron взагалі не мають змоги впоратися з цим.
Так, у Debian, Ubuntu та багатьох подібних дистрибутивах на основі Debian ...
Існує механізм з’єднання завдань cron, який бере конфігураційний файл, зв'язує їх і додає їх до вашої служби cron, що працює.
Ви можете помістити файл під /etc/cron.d/somefilename, де ім'я певного файлу - все, що вам потрібно.
sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync
Розберемо це:
sudo - тому що вам потрібні підвищені привілеї, щоб змінити конфігурації cron в каталозі / etc
echo - транспортний засіб для створення виводу на std out. printf, cat ... також працювали б
"- використовуйте подвійну цитату на початку рядка, ви професіонал
0,15,30,45 * * * * - стандартний графік запуску кронів, цей працює кожні 15 хвилин
ntpdate -u time.nist.gov - фактична команда, яку я хочу виконати
"- тому що мої перші подвійні цитати потребують приятеля, щоб закрити вихідний рядок
>> - подвійне переадресація додається замість перезаписів *
/etc/cron.d/vmclocksync - vmclocksync - це вибране ім'я файлу, воно входить у /etc/cron.d/
* якщо ми використовували переспрямування>, ми могли б гарантувати, що у нас є лише один запис завдання. Але ми ризикуємо виконувати будь-які інші правила в існуючому файлі. Ви можете вирішити для себе, чи можливе знищення за допомогою> правильно або можливі дублікати з >> для вас. Крім того, ви можете зробити щось перекручене чи пов'язане, щоб перевірити, чи існує ім'я файлу, чи є в ньому щось, і чи додаєте ви якийсь дублікат, - але у мене є речі, і я не можу цього зробити для ти зараз.
Сценарій 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
Ось функція 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"
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"
функція сценарію для додавання / видалення кроні. жодних записів дублювання:
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
Моїм кращим рішенням було б таке:
(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -
Це переконається, що ви правильно обробляєте порожній новий рядок внизу. Щоб уникнути проблем із crontab, зазвичай слід закінчувати файл crontab порожнім новим рядком. А вищезазначений сценарій гарантує, що він спочатку видаляє будь-які порожні рядки з "grep". частину, а потім додайте новий пустий рядок в кінці з "\ n" в кінці сценарію. Це також запобіжить отримання порожнього рядка над вашою новою командою, якщо ваш існуючий файл crontab закінчується порожнім рядком.
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune
Ні, в crontab немає можливості змінювати файли cron.
Вам потрібно: взяти поточний файл cron (crontab -l> newfile), змінити його і поставити новий файл на місце (crontab newfile).
Якщо ви знайомі з perl, ви можете використовувати цей модуль Config :: Crontab .
ТОО, Андреа
функція сценарію для додавання кроні. перевірити дублікати записів, корисні вирази *> "
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
джерело: мій мозок;)
Ви можете, можливо, змінити редактор за замовчуванням на ed та використовувати heredoc для редагування.
EDITOR=ed
export EDITOR
crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF
Зверніть увагу на головний > у цьому коді означає, що для створення нового рядка натискається клавіша повернення / введення.
У а засіб APPEND , тому він не буде переписувати що - небудь.
The .означає, що ви закінчили редагування.
The w засіб запису змін.
В Q означає QUIT або вихід ред.
ви можете це перевірити
crontab -l
Ви також можете видалити запис.
EDITOR=ed
export EDITOR
crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF
Це видалить запис crontab з Myscript у ньому.
В д засіб видалення малюнка всередині / / .
Не перевіряйте це ще раз
crontab -l
Це рішення працює всередині сценарію занадто менше > звичайно :-)