2016-04-01 6 views
0

Я пытаюсь убить все вхождения процесса, что происходит на самом деле, итерация останавливается после первого элемента, что здесь не так?Сценарий Bash перебирает PID и убивает объекты

#!/usr/bin/env bash 

SUPERVISORCLS=($(pidof supervisorctl)) 

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

Прежде чем я пытался что-н, как это в качестве решения для повторного запуска сценария, но, а сценарий не всегда был исполнен в сумме всегда только один, если блок был выполнен.?

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 

ответ

2

exec заменяет процесс с исполняемым файлом, что это аргумент к нему, так что вы никогда не будете выполнять еще одно заявление в сценарии после того, как она попадает в exec. Ваш процесс больше не будет существовать. В первом примере ваш процесс больше не будет вашим скриптом, он будет kill и pkill во втором.

Чтобы исправить это, просто удалите exec со всех этих линий. Это не нужно. При выполнении скрипта оболочка будет выполнять команды в каждой строке уже, вам не нужно говорить об этом.