8
votes

Comment arrêter la boucle infinie dans le script Bash gracieusement?

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.

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.

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.


0 commentaires

4 Réponses :


2
votes

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.


0 commentaires

24
votes

Vous pouvez piéger un signal, dire sigusr1: xxx pré>

puis, lorsque vous souhaitez quitter la boucle à la prochaine itération: p>

kill -SIGUSR1 pid


0 commentaires

1
votes

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


0 commentaires

1
votes

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


0 commentaires