我试图终止一个过程的所有出现,实际发生了什么,迭代在第一项之后停止了,这里出了什么问题?

#!/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

最佳答案

exec将进程替换为它的参数可执行文件,因此在脚本中的另一个语句命中exec后,您将永远不会执行它。你的过程将不再存在。在第一个示例中,您的进程将不再是您的脚本,在第二个示例中它将是killpkill
要修复它,只需从所有这些行中删除exec。不需要。在执行脚本时,shell将已经在每一行执行命令,您不必告诉它这样做。

10-08 08:10
查看更多