Forum Linux.débutant Utiliser kill pour arreter une boucle shell

Posté par  . Licence CC By‑SA.
Étiquettes :
3
25
juin
2018

Bonjour,
J'ai écrit un script shell qui se présenter sous la forme d'une boucle.
Un programme s’exécute pour chaque fichier à chaque tour de boucle.
Seulement lorsque je fais un top, je vois seulement le processus du programme qui travaille sur les fichiers à chaque tour de boucle.
J'ai beau faire un kill sur ce programme, la boucle shell continue.
Je souhaiterais un moyen de faire un kill directement sur le script shell afin de stopper la boucle.
Je ne parviens pas à l'identifier à l'aide du top.

Merci pour vos conseils

  • # pkill ?

    Posté par  . Évalué à 2.

    Je ne suis pas sur de t'avoir bien compris mais regarde pkill.

    • [^] # Re: pkill ?

      Posté par  . Évalué à 2. Dernière modification le 25 juin 2018 à 21:38.

      j'ai un script shell de cette forme :

      monscript.sh

      for fn in mon_fichier{1..70};
      do
        samp=`basename ${fn}`
        fastqc ${samp}.txt > ma_sortie.txt
      done

      Quand je fais un top je vois que le fastqc qui tourne donc si je kill ce processus,
      mon script shell continue à tourner.
      Ce que j'aimerais c'est identifier mon script shell et faire un kill dessus.

      Je ne sais pas si je suis claire

      • [^] # Re: pkill ?

        Posté par  . Évalué à 4.

        Plutôt que de faire un top, qui passera son temps à réordonner sa liste en fonction des processus actifs à un instant T, tu devrais utiliser ps et filtrer (grep) sur le nom de ton script shell.

        Sinon comme indiqué ailleurs, tu peux aussi utiliser pkill qui se basera sur le nom de ton process plutôt que de se baser sur son PID.

        un truc du genre pkill monscript.sh devrait donc faire l'affaire.

        • [^] # Re: pkill ?

          Posté par  . Évalué à 2.

          Super cela fonctionne, merci infiniment pour ces précieux conseils !

  • # Code de retour

    Posté par  . Évalué à 1.

    Bonsoir,

    Si tu tiens vraiment à arrêter le processus père (ton script), lorsque l'un de ses fils (fastqc) ne se termine pas correctement, tu peux tester le code de retour. C'est une valeur entière retournée par un programme lorsqu'il se termine. Dans le shell, si le processus est tué par un signal et qu'il ne se termine donc pas, le code de retour à pour valeur 128 plus le numéro du signal. Donc tu pourrais écrire:
    fastqc
    [ $? -eq 143 ] && { echo "Fastqc a été tué." ; exit 1 }

    Mais comme dit plus haut, il paraît plus logique de tuer le père pour tuer ce dernier, plutôt que tuer le fils pour tuer le père.

  • # Tuer le père

    Posté par  (site web personnel) . Évalué à 2.

    Comme évoqué dans les réponses précédentes, il faut tuer le père du processus que tu vois.

    Dans top, par défaut, le processus parent n'est pas affiché, il faut afficher la colonne PPID (appuyer sur la touche f pour le choix des colonnes).
    (personnellement, je préfère htop, mais c'est une question de goût)

    Du coup, tu fais un kill, non plus avec la valeur de la colonne PID, mais avec la valeur de la colonne PPID … après pkill fonctionne aussi très bien ! ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.