Bash: чтение переполнения при использовании подстановки команд и SSH
Я схожу с ума!
Когда я запускаю этот скрипт bash (prof of concept) и кормлю его достаточно быстро, он теряет циклы:
# 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 выполняется только один раз ("теряя" циклы) вместо трех раз?
Примечание: если я прокомментирую строку с $( 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
Затем я получаю ожидаемый результат с тремя строками. Кажется, что использование подстановки команд с помощью ssh делает так, что цикл while теряет циклы. Может кто-нибудь объяснить, почему происходит такое переполнение и как его избежать, все еще используя $( ssh ..) (который на самом деле мне нужен для сбора данных)?
Ура, AaWnSd