Как команда "Ping" отображает время и дату пинга

Когда я пингую, у меня появляется этот дисплей:

> ping -i 4 www.google.fr 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=503 ttl=46 time=45.5 ms..............64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=508 ttl=46 time=44.9 ms64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=509 ttl=46 time=45.1 ms

Я бы хотел узнать время пинга раньше.

Что-то вроде:

> (right functions) + ping -i 7 www.google.fr mardi 15 mai 2012, 10:29:06 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=503 ttl=46 time=45.5 ms..............mardi 15 mai 2012, 10:29:13 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=508 ttl=46 time=44.9 msmardi 15 mai 2012, 10:29:20 (UTC+0200) - 64 bytes from wi-in-f94.1e100.net (173.194.67.94): icmp_seq=509 ttl=46 time=45.1 ms

Как бы вы сделали это в командной строке (если это возможно)?

Воспользуйся:

ping www.google.fr | while read pong; do echo "$(date): $pong"; done

Вы получите такой результат:

enter image description here

1. время от ping -D

Еще одна возможность использовать ping -D опция, которая дает вам временную метку как время Unix.

tilo@t-ubuntu:~$ ping google.com -DPING google.com (173.194.33.73) 56(84) bytes of data.[1388886989.442413] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=1 ttl=57 time=11.1 ms[1388886990.443845] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=2 ttl=57 time=11.0 ms[1388886991.445200] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=3 ttl=57 time=10.8 ms[1388886992.446617] 64 bytes from sea09s15-in-f9.1e100.net (173.194.33.73): icmp_req=4 ttl=57 time=10.9 ms^C--- google.com ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3004msrtt min/avg/max/mdev = 10.860/11.005/11.139/0.123 mstilo@t-ubuntu:~$ 

вот такой awk cmd для преобразования метки времени в формат даты:

$ ping -D 10.1.1.1 | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[%F %T]", $1); print}'PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.[2020-04-10 19:25:08] 64 bytes from 10.1.1.1: icmp_seq=1 ttl=63 time=14.1 ms[2020-04-10 19:25:09] 64 bytes from 10.1.1.1: icmp_seq=2 ttl=63 time=12.9 ms[2020-04-10 19:25:10] 64 bytes from 10.1.1.1: icmp_seq=3 ttl=63 time=12.0 ms^C

PS: awk может быть полностью буферизован с помощью pipe, a fflush() после print исправит:

ping.ts(){    if [ -t 1 ]; then        ping -D "$@" | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[\033[34m%F %T\033[0m]", $1); print; fflush()}'    else        ping -D "$@" | awk '{ if(gsub(/\[|\]/, "", $1)) $1=strftime("[%F %T]", $1); print; fflush()}'    fi  }

2. время от date

Вот версия команды "Achu" с немного другим форматом:

ping www.google.com -i 10 -c 3000 | while read pong; do echo "$(date +%Y-%m-%d_%H%M%S): $pong"; done >PingTest_2014-01-04.log

Это заводит тебя:

2014-01-04_175748: 64 bytes from sea09s16-in-f19.1e100.net (173.194.33.115): icmp_req=13 ttl=57 time=10.5 ms

Существует утилита под названием ts, который считывает stdin, добавляет временные метки и записывает их в stdout:

me@my-laptop:~$ ping localhost | tsNov 08 09:15:41 PING localhost (127.0.0.1) 56(84) bytes of data.Nov 08 09:15:41 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.060 msNov 08 09:15:42 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.098 msNov 08 09:15:43 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.082 msNov 08 09:15:44 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.091 ms

Он может быть установлен в Ubuntu с помощью sudo apt install дополнительные материалы.

Вы также можете использовать gawk (или awk, если ваш /etc/alternatives/awk указывает на /usr/bin/gawk):

ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'

Это аналогично подходу в Ответ Ачу, но pingвыходной сигнал передается по каналу на gawk вместо цикла оболочки, который вызывает date. Как и в случае с этим подходом, он работает без -c, но если ты не пройдешь -c n чтобы пинг прекратился после n пингует, и вы останавливаете цикл с помощью Ctrl+C, ping не будет печатать обычную статистику.

ek@Io:~$ ping -c 4 www.google.fr | gawk '{print strftime("%c: ") $0}'Tue 03 Jan 2017 10:09:51 AM EST: PING www.google.fr (216.58.193.99) 56(84) bytes of data.Tue 03 Jan 2017 10:09:51 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=1 ttl=51 time=327 msTue 03 Jan 2017 10:09:52 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=2 ttl=51 time=302 msTue 03 Jan 2017 10:09:53 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=3 ttl=51 time=282 msTue 03 Jan 2017 10:09:54 AM EST: 64 bytes from sea15s08-in-f3.1e100.net (216.58.193.99): icmp_seq=4 ttl=51 time=349 msTue 03 Jan 2017 10:09:54 AM EST:Tue 03 Jan 2017 10:09:54 AM EST: --- www.google.fr ping statistics ---Tue 03 Jan 2017 10:09:54 AM EST: 4 packets transmitted, 4 received, 0% packet loss, time 3003msTue 03 Jan 2017 10:09:54 AM EST: rtt min/avg/max/mdev = 282.035/315.227/349.166/25.398 ms
ek@Io:~$ ping www.google.fr | gawk '{print strftime("%c: ") $0}'Tue 03 Jan 2017 10:10:35 AM EST: PING www.google.fr (216.58.193.99) 56(84) bytes of data.Tue 03 Jan 2017 10:10:35 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=1 ttl=51 time=305 msTue 03 Jan 2017 10:10:35 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=2 ttl=51 time=365 msTue 03 Jan 2017 10:10:36 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=3 ttl=51 time=390 msTue 03 Jan 2017 10:10:38 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=4 ttl=51 time=824 msTue 03 Jan 2017 10:10:38 AM EST: 64 bytes from sea15s08-in-f99.1e100.net (216.58.193.99): icmp_seq=5 ttl=51 time=287 ms^C

Это происходит независимо от того, происходит ли pingвыходной сигнал передается по каналу на gawk или раковина while петля. Причина в том, что команда на правой стороне канала, а не ping, получает СИГИНТ когда Ctrl+C нажимается, и ping не знает, нужно ли печатать статистику перед завершением работы.

Если вы бежали ping без -c на левой стороне канала (как показано выше), и вы хотите завершить его таким образом, чтобы он по-прежнему печатал статистику, а затем вместо нажатия Ctrl+C в терминале, где он запущен, вы могли бы запустить kill -INT pid с другого терминала, заменив PID с идентификатором процесса ping команда. Если вы используете только один экземпляр ping тогда вы могли бы просто использовать killall -INT ping.

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

sh -c 'echo $$; exec ping www.google.fr' | gawk '{print strftime("%c: ") $0}'

Затем в первой строке вывода будет показан идентификатор процесса ping команда (которая, как правило, каждый раз будет отличаться). Это выглядело бы так, но с другим временем и датой и, возможно, с другим идентификатором процесса:

Tue 20 Mar 2018 12:11:13 PM EDT: 7557

Затем, с другого терминала, вы можете запустить kill -INT 7557, заменяющий 7557 с фактическим идентификатором процесса, который вы видели, чтобы завершить ping команду таким образом, чтобы заставить ее печатать статистику.

(Если вы воспользуетесь преимуществами своей оболочки контроль работы функции, то вы можете достичь этого и в том же терминале. Но если вы хотите скопировать текст из своего терминала без необходимости удалять какую-либо постороннюю часть, где вы выполняли команды в этом терминале, тогда вам следует завершить работу ping с отдельного терминала.)

Дальнейшее чтение:

ping google.in | xargs -n1 -i bash -c 'echo `date +"%Y-%m-%d %H:%M:%S"`" {}"'

Если вы заинтересованы в сохранении его в файле, затем введите приведенную ниже команду в терминале

ping google.in | xargs -n1 -i bash -c 'echo `date +"%Y-%m-%d %H:%M:%S"`" {}"' >> "/home/name_of_your_computer/Desktop/Ping_Test.txt"

Вам не нужно создавать никаких текстовых файлов, это будет сделано автоматически

Ping_Test.txt

2018-04-19 15:35:53 PING google.in (216.58.203.164) 56(84) bytes of data.2018-04-19 15:35:53 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=1 ttl=57 time=23.0 ms2018-04-19 15:35:53 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=2 ttl=57 time=38.8 ms2018-04-19 15:35:54 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=3 ttl=57 time=32.6 ms2018-04-19 15:35:55 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=4 ttl=57 time=22.2 ms2018-04-19 15:35:56 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=5 ttl=57 time=22.1 ms2018-04-19 15:35:59 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=7 ttl=57 time=23.6 ms2018-04-19 15:36:00 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=8 ttl=57 time=22.6 ms2018-04-19 15:36:01 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=9 ttl=57 time=22.3 ms2018-04-19 15:36:02 64 bytes from bom07s11-in-f4.1e100.net (216.58.203.164): icmp_seq=10 ttl=57 time=26.3 ms

(спасибо Ачу и Элиа Кагану за идеи) есть способ

  • добавить время для ping выход
  • сохраняйте сноски на ping
  • и завершите всю эту конструкцию с помощью ctrl+c

чтобы сделать это, нужно указать правой части команды (после канала) игнорировать SIGINT с помощью trap "" INT:

$ ping www.google.fr | bash -c 'trap "" INT; awk "{print strftime(\"%c - \") \$0}"'  lun 26 Mar 2018 22:05:08 +0300 - PING www.google.fr (173.194.73.94) 56(84) bytes of data.lun 26 Mar 2018 22:05:08 +0300 - 64 bytes from lq-in-f94.1e100.net (173.194.73.94): icmp_seq=1 ttl=47 time=19.6 mslun 26 Mar 2018 22:05:09 +0300 - 64 bytes from lq-in-f94.1e100.net (173.194.73.94): icmp_seq=2 ttl=47 time=20.1 ms^Clun 26 Mar 2018 22:05:09 +0300 - lun 26 Mar 2018 22:05:09 +0300 - --- www.google.fr ping statistics ---lun 26 Mar 2018 22:05:09 +0300 - 2 packets transmitted, 2 received, 0% packet loss, time 1000mslun 26 Mar 2018 22:05:09 +0300 - rtt min/avg/max/mdev = 19.619/19.866/20.114/0.284 ms

Общая версия – Существует ли утилита Unix для добавления временных меток в stdin?