Bash 猛击。使用xargs kill-9进行while循环

Bash 猛击。使用xargs kill-9进行while循环,bash,while-loop,Bash,While Loop,我有一个IP地址列表,我必须为每个IP地址运行一个命令 我是用这个代码做的: array=($(</tmp/ip-addresses.txt)) for i in "${array[@]}"; do ./command start $i & done array=($(您的脚本将更改为: #!/bin/bash GAP=120 while : do #Do your stuff here sleep $GAP done exit 0 两分钟后,它将从刷新的文件中读取数据,

我有一个IP地址列表,我必须为每个IP地址运行一个命令

我是用这个代码做的:

array=($(</tmp/ip-addresses.txt))
for i in "${array[@]}"; do
./command start $i &
done

array=($(您的脚本将更改为:

#!/bin/bash
GAP=120
while :
do
   #Do your stuff here
sleep $GAP
done
exit 0
两分钟后,它将从刷新的文件中读取数据,这是一个简单的解决方法:(未测试)


让我重新措辞,看看我是否理解正确。您想要一个旧IP和新IP的数组,每两分钟,当前的新IP变为旧IP,并且将
/tmp/…
文件重新读取到新IP中。然后,您想要删除旧IP中的命令而不是新IP,并运行新IP中的命令而不是旧IP?如果
命令ly需要
kill-9
这是一个bug,应该避免。看看是否可以用较小的信号终止它。我的理解是,如果下次,数组中包含一些以前也存在的IP,它不应该被杀死和重生,而应该保持活着。
sleep_delay=120 # 2 mins
while true; do 
    ( 
        array=($(</tmp/ip-addresses.txt))
        for i in "${array[@]}"; do
        ./command start $i &
        done
        sleep $(( sleep_delay + 2 )) # 2 can be any number >0

    ) & PPID=$!
    sleep $sleep_delay
    pkill -9 -p $PPID
done
declare -A pid_array

while true; do

    array=($(</tmp/ip-addresses.txt))

    for i in `printf "%s\n" ${!pid_array[@]} | grep -v -f <(printf "%s\n" ${array[@]})`; do
        kill -9 ${pid_array[$i]} # please try to use better signal to kill, than SIGKILL
        unset pid_array[$i]
    done

    for i in "${array[@]}"; do
        if [ -z "${pid_array[$i]}" ]; then 
            ./command start $i & pid_array[$i]=$!
        fi
    done

    sleep 120
done