2016-04-01 7 views
0

Ich versuche alle Vorkommen eines Prozesses zu töten, was passiert eigentlich eine Iteration stoppt nach dem ersten Element, was ist hier falsch?Bash-Skript iterieren über PIDs und kill items

#!/usr/bin/env bash 

SUPERVISORCLS=($(pidof supervisorctl)) 

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

Bevor ich versuchte, etw wie diese als Lösung für restart Skript, sondern auch Skript nicht immer bei insgesamt ausgeführt wurde immer nur ein, wenn Block ausgeführt wurde.?

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 

Antwort

2

exec ersetzt Ihren Prozess mit der ausführbaren Datei, die das Argument es ist, so dass Sie nie wieder eine Anweisung in Ihrem Skript ausführen, nachdem es ein exec trifft. Dein Prozess wird nicht mehr existieren. Im ersten Beispiel wird Ihr Prozess nicht mehr Ihr Skript sein, es wird kill und pkill in der zweiten sein.

Um es zu beheben, entfernen Sie einfach exec von allen diesen Zeilen. Es ist nicht nötig. Beim Ausführen eines Skripts führt die Shell die Befehle in jeder Zeile bereits aus, Sie müssen es nicht dazu sagen.