У меня есть это:

 ping -q xxx.xxx.xxx.xxx & disown; pingpid=$!
 for run in {1..3}; do
 sleep 5
 stats+=$(kill -SIGQUIT $pingpid)
 done
 kill $pingpid

Так что в основном я запускаю ping в фоновом режиме с параметром -q (чтобы показать только статистику), получаю его PID и затем выполняю цикл for, в котором я хочу сохранить промежуточную статистику ping для каждого kill -SIGQUIT $pingpid в переменная ... это 3 строки статистики, разделенные на 5 секунд.

Я вижу, что промежуточная статистика выводится на стандартный вывод, но когда я проверяю переменную $stats, я обнаруживаю, что она пуста. Я также пробовал с перенаправлением stderr на stdout, но я все еще не могу заставить переменную хранить статистику в ней.

3
one-liner 6 Мар 2015 в 15:19

2 ответа

Лучший ответ

Вывод, который вы пытаетесь захватить, поступает из процесса ping (точнее, стандартной ошибки), а не из процесса уничтожения. Вам нужно захватить его вывод с перенаправлением при его запуске. Попробуй это:

stats=""
{
        read pingpid
        for run in {1..3}; do
                sleep 5
                kill -quit $pingpid
                read line
                stats+="$line"$'\n'
        done
} < <(ping -q xx.xx.xx.xx 2>&1 >/dev/null & echo $!)

kill $pingpid
stats=${stats%$'\n'}  # Remove the extra newline
echo "$stats"

Порядок перенаправления в команде ping, 2>&1 >/dev/null, перенаправляет стандартный выход на /dev/null, в то время как стандартная ошибка перенаправляется на вход цикла.

2
ccarton 6 Мар 2015 в 14:26

Чего вы на самом деле пытаетесь здесь достичь? Похоже, что вы действительно должны запускать ping с таймаутом или ограниченным количеством пакетов (в конце концов, это одно и то же).

for run in 1 2 3; do
    ping -c 5 -q 12.34.56.78 | tail -n 2
done

Обычный вывод из ping несколько более подробный, чем одна строка, которую вы получаете, когда вы отправляете ему SIGQUIT, поэтому нам нужны две строки вывода. Возможно, вы хотите передать какой-нибудь простой сценарий Awk для нормализации вывода, чтобы он соответствовал вашим потребностям, или, возможно, преобразовать его в машиночитаемый формат.

1
tripleee 9 Мар 2015 в 08:55