Як командувати “Ping” час відображення та дату ping


39

Коли я пінг, у мене з'являється цей дисплей:

> 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 ms
64 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 ms
mardi 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

Як би ви це зробили в командному рядку (якщо це можливо)?


Відповіді:


77

Використання:

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

Ви отримаєте такий результат:

введіть тут опис зображення


1
Вау дуже приємно. І корисно вивчити речі з шкаралупи. Дякую!
Олів'є Понс

ping 192.168.70.1 | while read pong; do echo "$(awk '{print $1}' /proc/uptime): $pong"; done
Перебіг

16

Ще одна можливість використання ping -Dопції, яка отримує часову позначку як час Unix.

tilo@t-ubuntu:~$ ping google.com -D
PING 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 3004ms
rtt min/avg/max/mdev = 10.860/11.005/11.139/0.123 ms
tilo@t-ubuntu:~$ 

Ось версія команди "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

6

Існує утиліта під назвою ts, яка читає stdin, додає часові позначки і записує її в stdout:

me@my-laptop:~$ ping localhost | ts
Nov 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 ms
Nov 08 09:15:42 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.098 ms
Nov 08 09:15:43 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.082 ms
Nov 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 moreutils


1
+1 Так само, як sidenote - ts не встановлено в Ubuntu (принаймні 16.04) за замовчуванням, тому вам потрібно встановити його якapt install moreutils
dmikam

3

Ви також можете використовувати gawk(або awk, якщо ваші /etc/alternatives/awkпункти /usr/bin/gawk):

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

Це схоже на підхід у відповіді Ачу , але pingвихідний сигнал передається на gawkзамість петлі оболонки, яка викликає date. Як і у випадку з цим підходом, він працює без -c, але якщо ви не перейдете до зупинки ping після n pings, і ви зупините цикл з + , не буде друкувати звичайну статистику.-c nCtrlCping

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 ms
Tue 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 ms
Tue 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 ms
Tue 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 ms
Tue 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 3003ms
Tue 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 ms
Tue 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 ms
Tue 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 ms
Tue 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 ms
Tue 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, отримує SIGINT, коли натискається Ctrl+ C, і pingне знає друкувати статистику перед тим, як припинити.

Якщо ви запустили pingбез -cлівої частини труби (як показано вище) і хочете припинити її таким чином, щоб вона все ще друкувала статистику, то замість натискання Ctrl+ Cу терміналі, де він працює, ви можете запустити з іншого терміналу, замінюючи ідентифікатор процесу команди. Якщо ви використовуєте лише один екземпляр, тоді ви можете просто використовувати .kill -INT PIDPIDpingpingkillall -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з окремого терміналу.)

Подальше читання:


чи є спосіб надіслати ctrl + c спочатку до ping?
atti

1
@atti Так, ви можете надіслати SIGINT(що саме натискання клавіш Ctrl + C) до pingпроцесу спеціально, використовуючи killабо killall. Цю відповідь я розширив деталями.
Елія Каган

Гарне використання awk. +1
ripat

0
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 ms
2018-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 ms
2018-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 ms
2018-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 ms
2018-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 ms
2018-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 ms
2018-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 ms
2018-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 ms
2018-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

-1

(спасибі Ачу та Еліа Каган за ідеї) є спосіб

  • додайте час на 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 ms
lun 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 1000ms
lun 26 Mar 2018 22:05:09 +0300 - rtt min/avg/max/mdev = 19.619/19.866/20.114/0.284 ms
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.