Comment arrêter un script à un moment précis jusqu'à ce qu'il soit relancé par cron?

12

J'ai un Raspberry Pi exécutant OSMC (basé sur Debian).

J'ai défini un travail cron pour démarrer un script, sync.sh, à minuit.

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

Je dois arrêter le script à 7h du matin. Actuellement j'utilise:

0 7 * * * shutdown -r now

Y a-t-il une meilleure façon? J'ai l'impression que le redémarrage est exagéré.

Merci

Anthony
la source

Réponses:

25

Vous pouvez l'exécuter avec la timeoutcommande ,

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. Si votre processus de synchronisation prend trop de temps, vous pouvez envisager une approche différente pour synchroniser vos données, peut-être bloquer la réplication.

Rabin
la source
Ma connexion Internet est lente, d'où la synchronisation si longue. Recommanderiez-vous un signal particulier?
Anthony
@Anthony comment synchronisez-vous en ce moment?
Rabin
lftp.tech
Anthony
@Anthony, vous pouvez essayer d'autres applications comme syncthing ( syncthing.net ) ou BTSync ( resilio.com ), qui fonctionnent au niveau du bloc du fichier à synchroniser
Rabin
9

Si votre synchronisation peut facilement continuer après 17 heures d'hibernation, essayez

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

Si votre synchronisation préfère redémarrer depuis le début, essayez

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

Si votre synchronisation ou ses sous-tâches ignorent les signaux mais ne laissent aucun débris, faites-le

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

killallpsmisc

Roman Czyborra
la source
J'utilise le script ci-dessous, avec le miroir -c, cela ne semble pas déranger d'être redémarré. Lequel des éléments ci-dessus recommanderiez-vous?: Gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony
Voyant ce script LFTP voulant qu'un SIGTERM nettoie son fichier de verrouillage et considérant la probabilité de dépassements de délai du serveur sur 17 heures d'inactivité ou pire encore des renumérotations inet [64], j'irais pour 0 0 * * * timeout 7h /usr/local/bin/sync.shou ma killall -TERMvariante pour la plupart équivalente .
Roman Czyborra
4

J'utiliserais également cron pour "arrêter" ou "tuer" ce service ou ce script à un moment spécifié.
Créez d'abord votre tâche cron pour exécuter votre tâche ou votre script. (vous pouvez facilement exécuter un autre cron qui tuera un travail qui a un nom sudo pkill wget)

Deuxièmement, vous voulez voir l'exécution des tâches crontab, dans un format utile et lisible, dans la sortie de:

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

Ils apparaîtront dans les premières lignes, quelque chose comme ceci:

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 première colonne est PID, la deuxième est l'ID de session et la troisième est la commande démarrée par cron. Vous pouvez tuer tous les processus liés à une tâche cron spécifique en utilisant l'ID de session, donc dans l'exemple ci-dessus, vous devez tuer l'ID de session 4289:

   pkill -s 4289

Vous devez mettre le pkill dans un script et l'exécuter en tant que cron

ddlingo
la source
L'ID de session changera-t-il à chaque exécution du travail cron? Et après avoir éteint et rallumé?
Anthony
oui ça va changer. Mais si vous le scriptez, vous pouvez obtenir le PID et le placer dans une variable. Vous pourrez peut-être simplement utiliser le nom s'il apparaît. pkill sync.sh
ddlingo