0

私は完全に夢中になります!

この bash (概念実証) スクリプトを実行して十分な速度でフィードすると、サイクルが失われます。

# cat sample 
#!/bin/bash
tail -n 0 -f log | while read l
do
    SSH_CMD=$( ssh myhost.sample.com 'ls' )
    X=$( ping -c3 $l )
    echo $( echo "$X" | grep 'time=' | tail -1 | sed 's/.*\(time=.*\) .*/\1/' )
done 

# ./sample&
[1] 32434
# echo 8.8.8.8 >> log
time=5.17
# #->THIS IS OK!
# echo -e "8.8.8.8\n8.8.8.8\n8.8.8.8" >> log
time=4.98
# #->DAMN! It runs only once instead of three times

十分に速く繰り返し発行すると、同じことが起こります。

# echo 8.8.8.8 >> log

while ループが 3 回ではなく 1 回しか実行されないのはなぜですか (「失う」サイクル)。

注: $( ssh ... ) で行をコメントすると

#SSH_CMD=$( ssh myhost.sample.com 'ls' )

またはそれを

SSH_CMD=$( sleep 3 && echo "blahhhshshs" )

そして次を発行します。

    # echo -e "8.8.8.8\n8.8.8.8\n8.8.8.8" >> log
        time=4.98
        time=4.88
        time=5.12

次に、期待される出力を 3 行で取得します。ssh でコマンド置換を使用すると、 while ループがサイクルを失うようです。$( ssh .. ) (実際にはデータを収集するために必要です) を使用して、このオーバーランが発生する理由とそれを回避する方法を誰かが説明できますか?

乾杯、 AaWnSd

4

0 に答える 0