Je dois exécuter une application dans toutes les x secondes, donc, aussi loin que Cron ne fonctionne pas avec des secondes de cette façon, j'ai écrit un script Bash avec une boucle infinie avec X secondes de sommeil. P>
Quand je dois arrêter le script en cours d'exécution manuellement, je voudrais le faire de manière correcte - laissez l'application complète fonctionner et ne pas entrer dans la boucle pour la prochaine fois. P>
Avez-vous une idée, comment cela peut être atteint? J'ai pensé à passer des arguments, mais je ne pouvais pas trouver comment passer l'argument pour exécuter un script. P>
4 Réponses :
Vous pouvez passer des arguments par un fichier. Sur chaque itération, vous pouvez lire ce fichier et voir si vos conférences en cours ont été modifiées. P>
Vous pouvez piéger un signal, dire sigusr1: puis, lorsque vous souhaitez quitter la boucle à la prochaine itération: p> kill -SIGUSR1 pid
La structure suivante peut être appropriée si vous devez faire du nettoyage de toute façon. Utilisez Kill comme indiqué dans la réponse de CDARKE.
#=============================================================== # FUNCTION DEFINITIONS #=============================================================== # . . . #=== FUNCTION ================================================ # NAME: cleanup # DESCRIPTION: #=============================================================== cleanup () { # wait for active children, remove empty logfile, ..., exit exit 0 } # ---------- end of function cleanup ---------- #=============================================================== # TRAPS #=============================================================== trap cleanup SIGUSR1 #=============================================================== # MAIN SCRIPT #=============================================================== echo -e "Script '$0' / PID ${$}" while : ; do # infinite loop # . . . sleep 10 done # . . . #=============================================================== # STATISTICS / CLEANUP #=============================================================== cleanup
La solution de piège posté plus tôt est bonne pour les grandes boucles, mais encombrante pour le cas commun où vous vous en bouchez sur une seule ou quelques commandes. Dans ce cas, je recommande la solution suivante:
while whatever; do command || break done