Je suis en train d'écrire un script bash qui lance quelques processus enfants, et qui sera exécuté par une tâche cron
toutes les heures. Il lance en réalité une commande rsync
vers un serveur distant, ainsi que la connexion ssh
associée.
Si la commande rsync ou le script prend trop de temps, je voudrais le arrêter ainsi que ses processus enfants, mais lui donner d'abord une période de grâce. Le script s'exécute toutes les heures, mais les 2 tentatives suivantes vérifieront qu'une instance précédente du script est en cours d'exécution et se termineront avant de tenter de commencer un transfert. La troisième tentative suivante tuera l'original, toujours en cours, avant de commencer un nouveau transfert.
J'ai décidé de contrôler cela en écrivant dans un fichier PID, la première instance écrit son PID dans le fichier, les deux tentatives suivantes écrivent leur PID dans le fichier avant de se terminer. La troisième tentative tue la première, ensuite écrase le fichier PID avec le nouveau PID. Tout achèvement réussi efface le fichier PID. Pour tuer tous les enfants, j'ai décidé d'utiliser le PGID de l'instance originale du script que j'obtiens avec :
previous_pid=$(head -n1 "$pid_file")
previous_groupid=$(ps -hp "$previous_pid" -o pgid:1)
Ensuite le tuer avec:
kill -- -"$previous_pid"
Ma préoccupation est qu'il puisse y avoir une condition où le script original est mort sans nettoyer le fichier PID, et ce PID est réutilisé, réutilisant également le PGID, alors je finirai par tuer un processus complètement sans rapport. Comment puis-je éviter cela?