我有一个IP地址列表,我必须为每个IP地址运行命令。
我用这段代码做了:
array=($(</tmp/ip-addresses.txt))
for i in "${array[@]}"; do
./command start $i &
done
现在,IP地址列表每2分钟不断刷新一次,我需要删除不再使用新IP地址的每个命令。 实际上,需要使用刷新的IP地址每2分钟再次执行该命令,并且需要杀死所有其他旧IP。
我该怎么做?
答案 0 :(得分:2)
一个简单的解决方法:(未经测试)
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 "%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
答案 1 :(得分:0)
您的脚本将更改为:
#!/bin/bash
GAP=120
while :
do
#Do your stuff here
sleep $GAP
done
exit 0
两分钟后,它将从刷新的文件中读取