Wie kann ich ein Skript zu einem bestimmten Zeitpunkt anhalten, bis es von cron erneut gestartet wird?

12

Ich habe einen Raspberry Pi mit OSMC (Debian-basiert).

Ich habe einen Cron-Job zum Starten eines Skripts, sync.sh, um Mitternacht festgelegt.

0 0 * * * /usr/local/bin sync.sh

Ich muss das Drehbuch um 7 Uhr morgens stoppen. Zur Zeit benutze ich:

0 7 * * * shutdown -r now

Gibt es einen besseren Weg? Ich denke, ein Neustart ist übertrieben.

Vielen Dank

Anthony
quelle

Antworten:

25

Sie können es mit dem timeoutBefehl ausführen ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PS. Wenn Ihr Synchronisierungsvorgang zu lange dauert, können Sie eine andere Methode zum Synchronisieren Ihrer Daten in Betracht ziehen und möglicherweise die Replikation blockieren.

Rabin
quelle
Meine Internetverbindung ist langsam, daher dauert die Synchronisierung so lange. Würden Sie ein bestimmtes Signal empfehlen?
Anthony
@Anthony wie synchronisierst du gerade?
Rabin
lftp.tech
Anthony
@Anthony Sie können andere Anwendungen wie syncthing ( syncthing.net ) oder BTSync ( resilio.com ) ausprobieren , die auf Blockebene der zu synchronisierenden Datei funktionieren
Rabin
9

Wenn die Synchronisierung nach 17 Stunden Ruhezustand problemlos fortgesetzt werden kann, versuchen Sie es

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

Wenn Ihre Synchronisierung lieber von Anfang an neu gestartet werden soll, versuchen Sie es

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

Wenn Ihre Synchronisierung oder ihre Unteraufgaben Signale ignorieren, aber keine Rückstände hinterlassen, machen Sie das

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc

Roman Czyborra
quelle
Ich verwende das unten stehende Skript, mit mirror -c scheint es nichts auszumachen, neu gestartet zu werden. Welche der oben genannten Optionen
Anthony
Angesichts des LFTP-Skripts, bei dem ein SIGTERM seine Sperrdatei bereinigen soll, und unter Berücksichtigung der Wahrscheinlichkeit von Server-Timeouts bei 17 Leerlaufstunden oder noch schlimmeren inet [64] -Renumerierungen würde ich mich für 0 0 * * * timeout 7h /usr/local/bin/sync.shoder meine meist äquivalente killall -TERMVariante entscheiden.
Roman Czyborra
4

Ich würde auch cron verwenden, um diesen Dienst oder dieses Skript zu einem bestimmten Zeitpunkt zu stoppen oder zu beenden.
Erstellen Sie zuerst Ihren Cron-Job, um Ihren Job oder Ihr Skript auszuführen. (Sie können problemlos einen anderen Cron ausführen, der einen Job mit einem Namen beendet. sudo pkill wget)

Zweitens möchten Sie sehen, wie Crontab-Tasks in einem nützlichen und lesbaren Format ausgeführt werden, und zwar in der Ausgabe von:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

Sie erscheinen in den ersten Zeilen in etwa so:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

Die erste Spalte enthält die PID, die zweite die Sitzungs-ID und die dritte den von cron gestarteten Befehl. Sie können alle Prozesse, die mit einer bestimmten Cron-Aufgabe zusammenhängen, mithilfe der Sitzungs-ID beenden. Im obigen Beispiel sollten Sie daher die Sitzungs-ID 4289 beenden:

   pkill -s 4289

Sie müssen den Befehl pkill in ein Skript einfügen und dieses als Cron ausführen

ddlingo
quelle
Ändert sich die Sitzungs-ID bei jeder Ausführung des Cron-Jobs? Was ist nach dem Aus- und Einschalten?
Anthony
Ja, es wird sich ändern. Wenn Sie jedoch ein Skript erstellen, können Sie die PID abrufen und in eine Variable einfügen. Möglicherweise können Sie den Namen nur verwenden, wenn er angezeigt wird. pkill sync.sh
ddlingo