Wie kann ich anschließend alle Befehle in crontab ausführen?

516
Jord Wegge

Betrachten Sie eine komplizierte Crontab von +100 Zeilen, in der viele Skripts anschließend ausgeführt werden, um Nachrichten von verschiedenen Clients abzufragen und zu verarbeiten.

Beim Neustart des Servers löse ich einige Skripts der wichtigsten Clients aus, die sofort ausgeführt werden sollen (Kopieren / Einfügen).

Ein Einzeiler für die Verarbeitung aller Crontab-Einträge würde jedoch erheblich helfen.

Alle Skripts befinden sich in / opt /, sodass alle Zeilen wie folgt aussehen:

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

In m werden manchmal auch h & dow "/" & "-" verwendet, zB:

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

TIA
Jord

0

3 Antworten auf die Frage

1
harrymc

Vielleicht suchen Sie nach dem Befehl run-parts, der ein Verzeichnis als Parameter verwendet und jede ausführbare Datei oder jedes Skript in diesem Verzeichnis ausführt.

Zum Beispiel :

run-parts /etc/cron.daily 
0
AFH

In Ihrer Frage haben Sie bereits das Zeugnis einer Antwort.

Wenn Sie Ihre crontabZeile ändern :

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

dann cron.tmpenthält alle Befehle, die Sie ausführen müssen. Sie können es so ausführen, wie es ist . ./cron.tmp, oder Sie können es ausführbar machen und direkt mit ausführen chmod +x cron.tmp && ./cron.tmp.

Wenn Sie eine temporäre Datei vermeiden möchten, können Sie Folgendes verwenden:

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

Sie müssen verwenden, evaldamit die Weiterleitungen in den Befehlen ausgeführt werden.

Beachten Sie, dass Sie die beiden grepLäufe in einer einzigen sedErsetzung kombinieren können :

crontab -l | sed -n 's=^[^#]*\(/opt/.*$\)=\1=p' | while read l; do echo eval $l; done 
Genau das, wonach ich gesucht habe ... Danke! Leicht geändert, um zu sehen, was passiert: `crontab -l | grep -v "#" | grep -o '/opt/.*$' | während l lesen l; eval $ l && echo $ l && sleep 2; fertig " Jord Wegge vor 6 Jahren 0
0
LawrenceC

Ein Einzeiler für die Verarbeitung aller Crontab-Einträge würde jedoch erheblich helfen.

Erstellen Sie ein Skript, das dies ausführt, und rufen Sie es dann von cron's auf @reboot:

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

Wenn Sie Verzeichnisse rekursieren müssen:

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

Haben Sie nur bestimmte Skripts, die Sie ausführen möchten, aber einige?

Tun Sie dies für jedes solche Skript:

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

Dann ruf das von cron's an @reboot:

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