bash.带有xargs的While循环杀死-9



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

我是这样做的:

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

现在,IP地址列表每2分钟刷新一次,我需要杀死所有不再具有新IP地址的命令。实际上,该命令需要每隔两分钟重新执行一次,使用刷新后的IP地址,并且需要杀死所有其他旧的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

注意:我没有优化你的代码,只是在你的代码周围添加了一个包装器。

编辑:

修改代码以满足在IP不变的情况下不杀死旧进程的要求。
注意:我自己没有测试过代码,所以在使用kill命令时要小心。您可以通过将echo放在kill语句之前进行测试。如果它运行良好,您可以使用脚本…

declare -A pid_array
while true; do
    array=($(</tmp/ip-addresses.txt))
    for i in `printf "%sn" ${!pid_array[@]} | grep -v -f <(printf "%sn" ${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

您的脚本将更改为:

#!/bin/bash
GAP=120
while :
do
   #Do your stuff here
sleep $GAP
done
exit 0

两分钟后,它将从刷新的文件

中读取

相关内容

  • 没有找到相关文章

最新更新