Рассмотрим сложный 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

ТИА
Jord

3 ответа3

1

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

Например :

run-parts /etc/cron.daily
0

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

Если вы измените строку 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
0

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

Создайте скрипт, который делает это, а затем вызовите его из cron @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/

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .