сеть часто выходит из строя, и я хотел бы контролировать вывод. Я попытался временно изменить команду, например:
ping www.google.fr | while read pong; do echo "$(date): $pong"; done 1>/dev/null && 2> ~/ping_err.log
, но STDERR все еще перенаправляется на STDOUT вместо ping_err.log
примечание: я хочу только STDERR в файле (не 2> & 1)
Спасибо!
Вместо того, чтобы отвечать на Ваш stderr
вопрос о перенаправлении, я предложу лучшее (по моему скромному мнению), путь:
В https://github.com/waltinator/net-o-matic.git
- Наблюдайте за потерей работоспособности сети (WiFi), затем сделайте указанную пользователями вещь зафиксировать ее.
Существует способ контролировать Ваше соединение:
ip monitor address | \
egrep --line-buffered \
'^Deleted [[:digit:]]+: [[:alnum:]]+[[:space:]]+inet[[:space:]].* scope global ' | \
while read line ; do
...
Мой net-o-matic
сценарий также содержит способ спросить однажды:
function netstate () {
# Return network state as "UP" or "DOWN"
#Adjust how you decide net is UP/DOWN
ip link show | egrep -q 'UP,LOWER_UP.* state UP'
if [[ $? -eq 0 ]] ; then
echo "UP"
else
echo "DOWN"
fi
}
С помощью кода это, кажется, работает:
$ ping www.google.fr 2>&1 > /dev/null | while read pong; do echo "$(date): $pong" ; done 2>&1 > ping_err.log
[no output]
$ cat ping_err.log
vie jul 5 15:56:09 -03 2019: ping: sendmsg: La red es inaccesible
vie jul 5 15:56:10 -03 2019: ping: sendmsg: La red es inaccesible
vie jul 5 15:56:11 -...
Я немного расширил ответ @schrodigerscatcuriosity:
ping -i 10 -O -q 192.168.88.2 2>&1 | while read pong; do echo "$(date): $pong" ; done 2>&1 | tee ping_err.log
-i 10
подождите 10 секунд перед отправкой каждого пакета -O
для регистрации ожидающего ответа ICMP ECHO до отправка следующего пакета-q
для тихого вывода (кроме тайм-аутов)| tee
для одновременного вывода на консоль и в файл