Come fermare uno script in un momento specifico fino a quando non viene riavviato da cron?


12

Ho un Raspberry Pi con OSMC (basato su Debian).

Ho impostato un lavoro cron per avviare uno script, sync.sh, a mezzanotte.

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

Devo interrompere la sceneggiatura alle 7 del mattino. Attualmente sto usando:

0 7 * * * shutdown -r now

C'è un modo migliore? Sento che il riavvio è eccessivo.

Grazie

Risposte:


25

Puoi eseguirlo con il timeoutcomando ,

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. Se il processo di sincronizzazione richiede troppo tempo, potresti prendere in considerazione un approccio diverso per la sincronizzazione dei dati, magari bloccare la replica.


La mia connessione Internet è lenta, quindi perché ci vuole così tanto tempo per la sincronizzazione. Consiglieresti qualche segnale particolare?
Anthony,

@Anthony come sincronizzi adesso?
Rabin,



@Anthony puoi provare altre applicazioni come syncthing ( syncthing.net ) o BTSync ( resilio.com ), che funzionano a livello di blocco del file da sincronizzare
Rabin

9

Se la sincronizzazione può continuare facilmente dopo 17 ore di ibernazione, prova

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

Se la sincronizzazione preferisce riavviarsi dall'inizio, provare

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

Se la tua sincronizzazione o le sue attività secondarie ignorano i segnali ma non lasciano detriti, procedi

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

killallpsmisc


Sto usando lo script che trovi di seguito, con mirror -c non sembra importare di essere riavviato. Quale delle precedenti consiglieresti ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony

Vedendo quello script LFTP che voleva che un SIGTERM pulisse il suo file di blocco e considerando la probabilità di timeout del server in 17 ore di inattività o peggio ancora di rinumerazioni [64], preferirei 0 0 * * * timeout 7h /usr/local/bin/sync.sho la mia killall -TERMvariante per lo più equivalente .
Roman Czyborra,

4

Vorrei anche usare cron per "fermare" o "uccidere" quel servizio o script in un determinato momento.
Innanzitutto crea il tuo cron job per eseguire il tuo lavoro o script. (puoi facilmente eseguire un altro cron che ucciderà un lavoro che ha un nome sudo pkill wget)

In secondo luogo, si desidera vedere l'esecuzione di attività crontab, in un formato utile e leggibile, nell'output di:

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

Appariranno nelle prime righe, qualcosa del genere:

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

La prima colonna è PID, la seconda è l'ID sessione e la terza è il comando avviato da cron. Puoi uccidere tutti i processi relativi a un'attività cron specifica usando l'ID sessione, quindi nell'esempio sopra dovresti uccidere l'ID sessione 4289:

   pkill -s 4289

Devi inserire il pkill in uno script ed eseguirlo come cron


L'ID sessione cambierà ogni volta che viene eseguito il processo cron? Che dire dopo aver spento e riacceso?
Anthony,

sì, cambierà. Ma se lo script, è possibile ottenere il PID e inserirlo in una variabile. Potresti essere in grado di usare il nome solo se si presenta. pkill sync.sh
ddlingo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.