Làm cách nào để đặt thời gian chờ ngắn với lệnh ping?


49

Tôi đang cố gắng viết một tập lệnh liệt kê tất cả các máy chủ trong mạng LAN của tôi (có khoảng 20 trong số chúng) và viết trạng thái ping bên cạnh mỗi máy chủ. Tôi có tập tin thuê DHCP, vì vậy tôi có tất cả các IP (giả sử 10.0.0.1, 10.0.0.2, v.v.), tất cả những gì tôi cần là trạng thái ping cho mỗi máy chủ.

Vì vậy, tập lệnh của tôi khởi chạy một ping duy nhất cho mỗi máy chủ:

ping -c 1 10.0.0.1

Thật không may, khi một máy chủ ngoại tuyến, ping mất nhiều thời gian để hết thời gian. Tôi đã kiểm tra man ping, dường như có hai tùy chọn để đặt thời gian chờ là: -w deadline-W timeout. Tôi nghĩ rằng tôi quan tâm đến cái sau.

Vì vậy, tôi đã thử điều này:

ping -c 1 -W 1 10.0.0.1

Nhưng chờ một giây trên mỗi máy chủ ngoại tuyến vẫn còn quá dài. Tôi đã cố gắng đặt nó xuống dưới một giây, nhưng dường như nó không tính đến tham số nào cả:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Có cách nào để đặt thời gian chờ thành giá trị thấp hơn không? Nếu không, có bất kỳ lựa chọn thay thế?

Biên tập

  • HĐH là Debian Lenny.
  • Các máy chủ tôi đang cố gắng ping thực sự là các điểm truy cập. Họ ở trên cùng một vlan và mạng con như người dùng (để đơn giản triển khai và thay thế). Đây là lý do tại sao tôi không muốn quét tất cả các mạng con ( ping -bví dụ với một ví dụ).

Chỉnh sửa # 2

Tôi chấp nhận fpinggiải pháp (cảm ơn tất cả các câu trả lời khác). Lệnh này thực hiện chính xác những gì tôi đang tìm kiếm:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Lệnh này mất tối đa 500ms để hoàn thành và cung cấp cho tôi trạng thái ping của tất cả các máy chủ cùng một lúc:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

Trên Debian Lenny, cài đặt không đáng kể:

aptitude update
aptitude install fping

Câu trả lời:


41

fping có thể là một công cụ tốt hơn so với ping stock bạn đang sử dụng. Bạn đang dùng hệ điều hành nào?

  • "fping khác với ping ở chỗ bạn có thể chỉ định bất kỳ số lượng mục tiêu nào trên dòng lệnh hoặc chỉ định một tệp chứa danh sách các mục tiêu cần ping."
  • "Thay vì gửi đến một mục tiêu cho đến khi hết thời gian hoặc trả lời, fping sẽ gửi một gói ping và chuyển sang mục tiêu tiếp theo theo kiểu vòng tròn."
  • "Không giống như ping, fping có nghĩa là được sử dụng trong các tập lệnh, vì vậy đầu ra của nó được thiết kế để dễ phân tích cú pháp."

1
Hoạt động tuyệt vời, cảm ơn, đây là những gì tôi đang tìm kiếm. Lệnh này thực hiện công việc tốt: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Toàn bộ điều này kéo dài nửa giây và tôi nhận được kết quả cho tất cả các máy chủ cùng một lúc. Công cụ tuyệt vời. :-))
MiniQuark

37

Đối với những người tìm kiếm một giải pháp liên quan ping, sử dụng -ichuyển đổi.

ping -i 0.2 www.google.com

Hoặc, nếu bạn muốn sử dụng 0,1, bạn sẽ cần chạy nó dưới quyền root

sudo ping -i 0.1 www.google.com

Không cần phải tải thêm tiện ích.


4
+1 từ tôi. Đây là kết quả đầu tiên khi googling "ping timeout", và đây chính xác là những gì tôi đang tìm kiếm.
Steven Jeffries

@StevenJeffries Tương tự ở đây!
Luc

1
Trong trường hợp máy chủ chết, giải pháp này sẽ in đầu ra hữu ích đầu tiên của nó sau khoảng 1 giây. Đây chắc chắn là câu trả lời sai vì @MarcelBurkhard đã đề cập.
Victor Yarema

1
Vấn đề với giải pháp này là -i 0,1 sẽ KHÔNG chờ 100ms, nhưng lâu hơn, đối với các ping mất hơn 100ms, do đó sẽ làm mất thời gian.
Llamageddon

2
Câu trả lời này không chính xác - nó không thay đổi trong bao lâu pingsẽ chờ phản hồi - thay vào đó, nó chỉ gửi các lệnh ping liên tiếp nhanh hơn ....
Mtl Dev

21

Bạn có thể đặt thời gian chờ ngắn bằng timeoutlệnh trên Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }

Câu trả lời tốt! Bây giờ tôi đã làm: hết thời gian 1 ping -c 1 test.com
vrijdenker 23/2/2016

1
Phiên bản hết giờ của tôi chỉ chấp nhận 1 giây. timeout (GNU coreutils) 8.4.
slm

Tôi thích giải pháp này, nó có thể được áp dụng cho tất cả các lệnh khác
datdinhquoc

@slm, thật lạ là phiên bản của bạn không hỗ trợ dưới một giây. Nó hoạt động với tôi: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... Trong man timeoutbáo cáo trường hợp của tôi GNU coreutils 8.26. BWT, tôi đang sử dụng Ubuntu 17.04.
Victor Yarema

Đây thực sự là điều duy nhất hoạt động nếu bạn muốn giảm thời gian chờ (máy chủ không phản hồi) ... Bạn phải làm toán mặc dù: thời gian chờ phải lớn hơn "-c" * "-i" của lệnh ping-
Marki

13

Tôi sẽ sử dụng nmap cho nhiệm vụ này.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Xem Tài liệu nmap để biết thêm chi tiết về điều này.


Cuộc gọi tốt .. Đây là cách "Tuyệt vời" để thực hiện: D +1
Arenstar

Xin chào, tôi vừa thử cái này, nhưng tôi nhận được thông báo lỗi sau: "--host-timeout được chỉ định bằng mili giây trừ khi bạn đủ điều kiện bằng cách nối thêm 's', 'm', 'h' hoặc 'd'. phải lớn hơn 1500 mili giây ".
MiniQuark

Tôi nghĩ vấn đề là hiển nhiên, thời gian chờ không thể ngắn hơn 1500ms. Tôi nghĩ rằng bạn nên tìm kiếm các tùy chọn nmap lấy lại song song tôi nghĩ.
tốc độ

Điều này dường như chỉ gửi một yêu cầu. Tôi đang tìm kiếm phát hiện lỗi liên tục, tôi đã đến đây bằng cách Googling "hết thời gian chờ ping mili giây", nmap có cung cấp infinie-pings như ub Ubuntu ping không?
ThorSummoner

đặt thời gian chờ thành một cái gì đó thấp hơn một giây sẽ liên quan đến việc sử dụng một người dùng đặc quyền như trong câu trả lời @ victor-bjelkholm
thrau

4

bạn có thể muốn xem công cụ ping arp nếu tất cả các máy chủ của bạn nằm trên mạng LAN vật lý. Nó cũng làm điều tương tự nhưng sử dụng các gói arp lớp 2 để thực hiện 'ping'. Bạn có thể sử dụng kết hợp arpping và icmp ping, hoặc trên thực tế là ping tcp, để thu thập những gì thất bại. Ví dụ là sự cố ngăn xếp tcp, mặc dù ngày nay rất hiếm, chúng ta có thể tìm thấy nếu một ngăn xếp tcp máy bị hỏng, vì máy sẽ không phản hồi ping, tuy nhiên nó sẽ phản hồi với arp (là một đoạn mã khác trên máy chủ) .

bằng cách sử dụng kết hợp arpping, tcpping và icmp ping, bạn có thể tìm hiểu xem dịch vụ trên máy có bị lỗi không, ngăn xếp tcp bị hỏng hoặc máy bị khóa hoàn toàn. Nếu bạn đã quản lý các công tắc ethernet, bạn có thể nhận dữ liệu liên kết vật lý, tiết lộ nếu máy thực sự được bật hoặc đã được rút phích cắm vật lý. Chúng tôi đã có một tình huống mà máy móc (khách hàng trong phòng công cộng) sẽ bị tắt, chúng tôi đã thu thập dữ liệu đó và đánh thức được gửi trên các gói lan, để tăng sức mạnh cho máy. :-)

Dù bạn đang xây dựng giải pháp nào, nếu mạng của bạn bận, hãy nghĩ đến việc triển khai một số loại qos, để các gói giám sát của bạn được ưu tiên trên mạng, mất các gói đo do tắc nghẽn mạng có thể đưa ra cảnh báo sai. Nếu sử dụng qos để theo dõi các gói, thì bạn sẽ cần suy nghĩ về việc thu thập dữ liệu về việc sử dụng mạng.

Vì vậy, bạn có thể làm cho giải pháp giám sát của mình phức tạp hoặc dễ dàng như bạn muốn. Chúng tôi thấy ngay cả hệ thống giám sát cơ bản nhất cũng là một bước đi đúng hướng, ít nhất một số quản trị viên đang để mắt đến máy móc :-).

chúc may mắn!


3

@ jordon-bedwell có một gợi ý tuyệt vời.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux giải thích rằng thời gian chờ ping chỉ bắt đầu sau khi địa chỉ IP được xác định. Nếu bạn sử dụng một dns và máy trạm của bạn ngoại tuyến thì ping không thể xác định địa chỉ IP và do đó xuất hiện để chờ khoảng 20 + giây mặc định trước khi trả về sai.

Sử dụng công cụ 'hết thời gian' của linux cung cấp nhiều quyền kiểm soát hơn khi chạy ping với một tên miền.

Cảm ơn các bạn


2

Sử dụng chuyển đổi -w , cả trên Windows và Debian.

Đây là một cách nhanh chóng để kiểm tra xem máy có phản hồi hay không, giả sử rằng nó sẽ phản hồi kịp thời sau đó số lượng giây được chỉ định.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

1

Nếu bạn có thể quét mạng con của mình (hoặc một phần của nó) mà không kích hoạt báo động bảo mật và không bận tâm thêm một chút dữ liệu, Angry IP Scanner rất nhanh, miễn phí, cho phép bạn nhấp để sắp xếp theo trạng thái và có thể cung cấp thông tin chi tiết hơn .


0

Tại sao không khởi chạy ping trong nền, với đầu ra thành một tệp tạm thời, song song cho mọi máy chủ? Sau đó ngủ một giây, giết mọi tiến trình ping vẫn đang chạy và đọc các tệp để thu thập đầu ra.


1
Tôi đoán nó sẽ hoạt động, nhưng tôi đang tìm kiếm một giải pháp đơn giản hơn. Dù sao cũng cảm ơn bạn.
MiniQuark

Phương pháp này không mở rộng quy mô.
Synetech

0

Thời gian chờ là một giá trị nguyên cho biết gói có thể được gửi bao xa. Giá trị dưới 1 là vô nghĩa. Giá trị 1 cho biết bạn chỉ ping hàng xóm ngay lập tức.

Cách duy nhất để tăng tốc mọi thứ là chạy kiểm tra lý lịch và thu thập kết quả. Đây là những gì các công cụ như Nagios làm.


1
Tôi xin lỗi, nhưng tôi thực sự không nghĩ rằng điều này là đúng. Trang hướng dẫn khá rõ ràng rằng -W chỉ định "Thời gian chờ phản hồi, tính bằng giây"; nó không phải là thứ nguyên và mặc dù ping không tôn trọng các giá trị dưới 1 (do đó câu hỏi) thời gian chờ phụ thứ hai không phải là vô nghĩa. Nếu bạn tha thứ cho tôi, bạn có thể nhầm lẫn -W với -t, cài đặt sau của trường IP TTL (số đếm hop), hoạt động như bạn đã mô tả và trong đó các giá trị dưới 1 thực sự vô nghĩa.
MadHatter

-W là thời gian quá trình ping chờ phản hồi và có thể có ý nghĩa trong việc đặt nó ở dưới mức hop khi số hop cao, như thường lệ. Trong ba giây, bạn thường nhận được vào điều kiện thử lại. Một số công cụ có thể cho phép sử dụng bộ đếm thời gian mịn hơn cho thời gian chờ, nhưng đối với hầu hết việc sử dụng ping, giây là một đơn vị hợp lý.
BillThor

0

Bạn có thể thử một cái gì đó như thế này. Nhưng phải mất 15 phút để chạy.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log

Có vẻ như nmapsẽ là công cụ phù hợp cho công việc.
kasperd


-1

ping có các tùy chọn [-t timeout] và [-W waittime] để bạn có thể làm:

ping -c 1 -t 1 -W 1 google.com
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.