Cách nhanh hơn ping để kiểm tra nếu máy tính trực tuyến?


20

Tôi đang viết một cảnh báo về kịch bản lan cho một bộ máy tính trong phòng thí nghiệm của chúng tôi. Chúng tôi có db sqlite với một danh sách các tên máy chủ, IP và MAC và hiện tại tôi ping từng cái với '-c1' để nó không chạy vô tận - nhưng ngay cả khi phải chờ đợi, vẫn có cách nhanh hơn để có được Trả lời chứ không phải ping? Sử dụng ping dường như làm chậm kịch bản một chút vì nó cần câu trả lời ping để tiếp tục.

Cảm ơn rất nhiều cho bất kỳ đề nghị!

Câu trả lời:


20

Gửi một gói duy nhất và chờ phản hồi sẽ là một trong những cách nhanh nhất có thể và ping là một cách tốt để làm điều đó. Trong thực tế, tùy thuộc vào trường hợp sử dụng của bạn, tôi cho rằng nó quá nhanh , vì nó không thực sự cho bạn biết hệ thống có thực sự làm gì hữu ích hay không, chỉ là hệ thống con của hạt nhân đang hoạt động và được cấu hình.

Nhưng giả sử như vậy là đủ tốt, bạn có thể thực hiện một số cải tiến. Đầu tiên, bạn có thể sử dụng -W1để giảm thời gian chờ ping xuống còn một giây. Thứ hai, bạn có thể làm cho tập lệnh của mình ping các máy chủ khác nhau một cách không đồng bộ (trong một luồng nền) và kiểm tra kết quả khi cần thay vì chờ đợi.

Thay phiên, bạn có thể suy nghĩ lại cách tiếp cận và yêu cầu các hệ thống từ xa kiểm tra bằng cách nào đó khi chúng hoạt động và nếu một hệ thống chưa được đăng ký, bạn có thể cho rằng nó bị hỏng.


Cuộc gọi tốt về việc bổ sung -w, phải thực hiện hai lần mặc dù nguyên nhân là một loạt các máy tính không đáp ứng đủ nhanh. Có thể xem xét thêm một số loại đăng ký định kỳ hoặc lắc tay nhưng bây giờ muốn có quy trình tương đối bên ngoài với các máy tính tôi đang bật.
Jon Phenow

1
Tôi cũng sử dụng -s để gửi một gói nhỏ hơn.
Shawn J. Goff

3
Tôi sẽ bị sốc nếu gửi một gói nhỏ hơn tạo nên sự khác biệt.
mattdm

Không phải họ đã gửi khá nhiều ở kích thước gần tối thiểu của các gói sao?
Jon Phenow

4
Chúng khá nhỏ; có mặc định 56 byte dữ liệu mà bạn có thể giảm. Nhưng trong mọi trường hợp, nó nhỏ hơn MTU ethernet và lớn hơn không có gì, do đó, nó đi xuống "một gói" theo bất kỳ cách nào.
mattdm

7

Đây là những gì fping được thiết kế cho. http://fping.sourceforge.net/

Bạn cần phân tích đầu ra sau đó thay vì dựa vào mã trả về, nhưng nó nhanh hơn nhiều so với thực hiện ping thông thường.


Tôi nghĩ thật buồn cười khi mô tả nói "Không giống như ping, fping có nghĩa là được sử dụng trong các tập lệnh và đầu ra của nó rất dễ phân tích." nhưng nó không cung cấp mã trả về
Adam Plocher

Giá trị tốt sẽ là gì cho mã trả về?
Thorbjørn Ravn Andersen

3

Điều này sẽ chỉ hoạt động cho một hoặc hai máy tính, nhưng nếu bạn kết nối chúng trực tiếp với máy tính chịu trách nhiệm kiểm tra trạng thái của chúng, bạn có thể sử dụng ethtoolđể xem liên kết có hoạt động hay không.


Tôi chưa sử dụng ethtool cho việc này, bạn có muốn đưa ra một ví dụ không? (hoặc có thể là một liên kết)?
Johan

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'sẽ trở lại yesnếu một máy được kết nối, và nonếu không.
LawrenceC

2

Những gì bạn có thể làm là ping địa chỉ quảng bá sẽ khiến tất cả các máy tính ping trở lại. Sau đó, bạn có thể kiểm tra chéo danh sách này với những gì bạn có trong SQLite để đảm bảo tất cả các máy tính đều hoạt động.

Mặt khác, ping có lẽ là cách nhanh nhất để đảm bảo máy tính hoạt động trên mạng. Như được đề cập bởi câu trả lời khác, điều này không cung cấp bất kỳ dữ liệu thực sự hữu ích. Nếu bạn có khả năng cài đặt các tập lệnh, bạn có thể thêm một cronjob để ping máy chủ trung tâm, chạy một tác vụ hoặc chỉ cần lặp lại danh sách quy trình đến một máy chủ trung tâm sẽ ghi nhật ký yêu cầu. Sau đó, chỉ cần kiểm tra sẽ cho bạn biết nếu bạn có bất kỳ vấn đề nào mà không cần phải kiểm tra thủ công mỗi lần.


1
Tôi giả sử bạn có nghĩa là ping địa chỉ quảng bá, không phải cổng. Trên các hệ thống hiện đại, điều đó có thể sẽ không hoạt động. Xem unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm

1
@mattdm: Multicast thì sao? Tôi đã không nhận ra hầu hết mọi người đã tắt nó. Tôi chưa từng gặp vấn đề với nó trước đây.
Josh K

Haha vâng cảm ơn mattdm, một vấn đề tương tự bạn có thể thấy tôi gặp phải. Nó không phải là mọi người tắt chúng nhưng họ thường đi kèm với phát sóng gần đây rõ ràng.
Jon Phenow

Có thể sử dụng fping ( fping.sourceforge.net ) để ping danh sách các máy chủ song song. Sau đó, bạn không cần phải dựa vào việc có thể ping địa chỉ quảng bá.
mazianni

2

Ganglia sử dụng lưu lượng phát đa hướng để giám sát nhiều máy chủ trong một cụm, có lẽ bạn có thể sử dụng một cái gì đó tương tự? Điều này giả định rằng phần cứng mạng của bạn cho phép lưu lượng phát đa hướng giữa tất cả các máy chủ và hệ thống giám sát của bạn.


1
Trông giống như một công cụ tuyệt vời nhưng với mục đích của tập lệnh nhỏ này có thể thêm một số đoạn không cần thiết vào dự án, hãy giữ nó như một kịch bản nhỏ bây giờ. Chắc chắn tôi sẽ để mắt đến nó, trông giống như một công cụ mà tôi có thể sử dụng sớm không phải là ít.
Jon Phenow

0

Tôi đã có cùng một vấn đề và đã đưa ra kịch bản (nhanh & bẩn) sau đây. Điều này về cơ bản phát hành tất cả các ping như các công việc riêng biệt song song và sẽ quét toàn bộ / 24 mạng con trong 3 giây; lưu ý rằng vì một số lý do tôi không bận tâm tìm hiểu tôi không thể sử dụng mã kết quả ping ở đây nhưng grep -v đã thực hiện công việc:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac

0

Trong C,

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */

0

Tôi đã tìm thấy fping -r0 ...để cung cấp phản ứng nhanh nhất.

Các -r(retry) tùy chọn dường như nhanh hơn so với tương tự -c(count). Sử dụng -r0kết quả chỉ trong một ping được gửi và đầu ra được viết tắt nhiều so với các tùy chọn khác.

Trên hệ thống của tôi ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Kết quả trong...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Một chút xoa bóp để loại bỏ ICMP(các) tin nhắn mang lại cho tôi ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

Về tốc độ, fpingtrên Intel Dual-Core 1,8 GHz cũ này với RAM 4GB là ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

grepsortdường như chỉ làm tăng thêm 0.001-0.004s đến thời điểm ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

GHI CHÚ

  • Các ICMPthông điệp không xảy ra trên mỗi chạy.
  • Điều 2>&1cần thiết là ngăn chặn ICMPthông báo hiển thị trong đầu ra khi nó được gửi đến stderrthay vì stdout.
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.