Как я могу выполнить все команды в crontab впоследствии?

335
Jord Wegge

Рассмотрим сложный crontab из +100 строк, где впоследствии запускается множество скриптов для опроса и обработки сообщений от разных клиентов.

После перезагрузки сервера я запускаю сразу несколько сценариев наиболее важных клиентов (копирование / вставка).

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

Все сценарии находятся в / opt /, поэтому все строки выглядят так:

m h dom mon dow /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1 

В m, h & dow "/" & "-" также иногда используются, например:

*/3 5-21 * * 1-5 /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1 */5 0-1,5-23 * * * /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1 25 2 * * 7 /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1  crontab -l | grep -v "#" | wc -l 129 

ТИА
Джорд

0

3 ответа на вопрос

1
harrymc

Возможно, вы ищете команду run-parts, которая принимает каталог в качестве параметра и запускает каждый исполняемый файл или скрипт в этом каталоге.

Например :

run-parts /etc/cron.daily 
0
AFH

У вас уже есть ответ на ваш вопрос.

Если вы измените свою crontabстроку на:

crontab -l | grep -v "#" | grep -o '/opt/.*$' > cron.tmp 

затем cron.tmpбудет содержать все команды, которые вам нужно выполнить. Вы можете запустить его как есть . ./cron.tmp, или вы можете сделать его исполняемым и запустить его напрямую chmod +x cron.tmp && ./cron.tmp.

Если вы хотите избежать временного файла, вы можете использовать:

crontab -l | grep -v "#" | grep -o '/opt/.*$' | while read l; do eval $l; done 

Вы должны использовать evalтак, чтобы перенаправления в командах были задействованы.

Обратите внимание, что вы можете объединить два grepпрогона в одну sedзамену:

crontab -l | sed -n 's=^[^#]*\(/opt/.*$\)=\1=p' | while read l; do echo eval $l; done 
Именно то, что я искал .... Спасибо! Немного изменен, чтобы увидеть, что происходит: `crontab -l | grep -v "#" | grep -o '/opt/.*$' | пока читаю л; do eval $ l && echo $ l && sleep 2; done` Jord Wegge 5 лет назад 0
0
LawrenceC

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

Создайте скрипт, который делает это, затем вызовите его из crons @reboot:

#!/bin/bash for script in /opt/XXXXXX/YYYYY/*.sh; do $script done 

Если вам нужно набирать каталоги:

#!/bin/bash find /opt/XXXXXX/ -name '*.sh' -type f -exec '{}' \; 

Есть только определенные сценарии, которые вы хотите запустить, но их куча?

Сделайте это для каждого такого скрипта:

ln -s /opt/XXXXXX/YYYYY/whatever.sh /opt/run-at-reboot/ 

Затем вызовите это из crons @reboot:

#!/bin/bash for script in /opt/run-at-reboot/*.sh; do $script done 

Похожие вопросы