簡體   English   中英

慶典。 while循環使用xargs kill -9

[英]bash. while loop with xargs kill -9

我有一個IP地址列表,我必須為每個IP地址運行一個命令。

我用這段代碼做了:

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

現在,IP地址列表每2分鍾不斷刷新一次,我需要刪除不再使用新IP地址的每個命令。 實際上,需要使用刷新的IP地址每2分鍾再次執行該命令,並且需要殺死所有其他舊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命令時要小心。 您可以通過在kill語句之前放置echo來進行測試。 如果它運作良好,您可以使用腳本...

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

您的腳本將更改為:

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

兩分鍾后,它將從刷新的文件中讀取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM