2016-04-01 1 views
0

J'essaye de tuer toutes les occurrences d'un processus, qu'est-ce qui se passe réellement une itération s'arrête après le premier élément, qu'est-ce qui ne va pas ici?Script Bash itérer sur les PID et tuer les objets

#!/usr/bin/env bash 

SUPERVISORCLS=($(pidof supervisorctl)) 

for i in "${SUPERVISORCLS[@]}" 
    do 
     echo $i 
     exec sudo kill -9 ${i} 
    done 

Avant essayé STH comme celui-ci comme solution pour le script de démarrage, mais en tant que script bien n'a pas été toujours exécuté au total de toujours un seul si le bloc a été exécuté.?

ERROR0=$(sudo supervisord -c /etc/supervisor/supervisord.conf 2>&1) 

if [ "$ERROR0" ];then 
    exec sudo pkill supervisord 
    exec sudo supervisord -c /etc/supervisor/supervisord.conf 
    echo restarted supervisord 
fi 

ERROR1=$(sudo supervisord -c /etc/supervisor/supervisord.conf 2>&1) 

if [ "$ERROR1" ];then 
    exec sudo pkill -9 supervisorctl 
    exec sudo supervisorctl -c /etc/supervisor/supervisord.conf 
    echo restarted supervisorctl 
fi 

Répondre

2

exec remplace votre processus avec l'exécutable qui est l'argument, donc vous ne serez jamais exécuter une autre déclaration dans votre script après une frappe exec. Votre processus n'existera plus. Dans le premier exemple, votre processus ne sera plus votre script, il sera kill et pkill dans la seconde.

Pour résoudre ce problème, supprimez simplement exec de toutes ces lignes. Ce n'est pas nécessaire. Lors de l'exécution d'un script, le shell exécutera les commandes sur chaque ligne, vous n'avez pas besoin de lui dire de le faire.