У меня есть это:
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, но я все еще не могу заставить переменную хранить статистику в ней.
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
, в то время как стандартная ошибка перенаправляется на вход цикла.
Чего вы на самом деле пытаетесь здесь достичь? Похоже, что вы действительно должны запускать ping
с таймаутом или ограниченным количеством пакетов (в конце концов, это одно и то же).
for run in 1 2 3; do
ping -c 5 -q 12.34.56.78 | tail -n 2
done
Обычный вывод из ping
несколько более подробный, чем одна строка, которую вы получаете, когда вы отправляете ему SIGQUIT, поэтому нам нужны две строки вывода. Возможно, вы хотите передать какой-нибудь простой сценарий Awk для нормализации вывода, чтобы он соответствовал вашим потребностям, или, возможно, преобразовать его в машиночитаемый формат.
Похожие вопросы
Новые вопросы
bash
Этот тег предназначен для вопросов о сценариях, написанных для командной оболочки Bash. Сценарии оболочки с синтаксисом или другими ошибками, пожалуйста, проверьте их на https://shellcheck.net, прежде чем публиковать здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут актуальны на Unix & Linux Stack Exchange или Super User, чем на Stack Overflow.