Como posso executar todos os comandos no crontab subsequentemente?

0

Considere um crontab complicado de +100 linhas em que muitos scripts são executados posteriormente para poll & processar mensagens de diferentes clientes.

Após a reinicialização do servidor, eu disparo alguns scripts dos clientes mais importantes para serem executados imediatamente (copiar / colar).

No entanto, um one-liner para processar todas as entradas de crontab ajudaria muito.

Todos os scripts residem em / opt /, portanto, todas as linhas parecem:

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

Em m, h & dow "/" & "-" também são usados às vezes, por exemplo. :

*/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

T.I.A.
Jord

    
por Jord Wegge 01.10.2018 / 15:15

3 respostas

0

Você já tem os ingredientes de uma resposta em sua pergunta.

Se você modificar sua linha crontab para:

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

então cron.tmp conterá todos os comandos que você precisa executar. Você pode executá-lo como está com . ./cron.tmp ou pode torná-lo executável e executá-lo diretamente com chmod +x cron.tmp && ./cron.tmp .

Se você quiser evitar um arquivo temporário, use:

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

Você precisa usar eval para que os redirecionamentos nos comandos sejam executados.

Observe que você pode combinar os dois grep em uma única substituição sed :

crontab -l | sed -n 's=^[^#]*\(/opt/.*$\)==p' | while read l; do echo eval $l; done
    
por 01.10.2018 / 15:39
1

Talvez você esteja procurando o comando run-parts , que pega um diretório como parâmetro e executará todos os executáveis ou scripts neste diretório.

Por exemplo:

run-parts /etc/cron.daily
    
por 01.10.2018 / 15:35
0

However, a one-liner to process all crontab-entries would greatly help.

Crie um script que faça isso e chame-o em cron ' @reboot :

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

Se você precisar recriar os diretórios:

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

Só tem certos scripts que você deseja executar, mas um monte deles?

Faça isso para cada script:

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

Em seguida, chame isso de cron ' @reboot :

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