Shell lệnh / script để xem nếu một máy chủ còn sống?


9

Tôi đang cố gắng tìm ra nhiều cách hơn để xem liệu một máy chủ nhất định có hoạt động hay không, chỉ sử dụng các lệnh shell (chủ yếu là bash). Lý tưởng nhất là nó có thể hoạt động với cả tên máy chủ và địa chỉ IP. Ngay bây giờ cách duy nhất mà tôi biết là ping, có lẽ được tích hợp vào một tập lệnh như được mô tả ở đây. Còn ý tưởng nào khác không?

Câu trả lời:


7

ping cách để kiểm tra xem một máy chủ có còn sống và được kết nối hay không. (Nếu một máy chủ còn sống nhưng bị ngắt kết nối hoặc phản hồi chậm, bạn không thể phân biệt điều đó với việc nó đang chết.)

Các tùy chọn được hỗ trợ bởi pinglệnh khác nhau tùy theo hệ thống. Bạn sẽ muốn đảm bảo rằng nó không lặp lại mãi mãi mà sẽ quay lại sau vài giây nếu nó không nhận được phản hồi.

Với FreeputD và Linux iputils, ping -c 1 -W 1 >/dev/nullgửi một ping duy nhất và đợi 1 giây. Bạn không cần phân tích cú pháp đầu ra: lệnh trả về 0 nếu nó nhận được ping trở lại và khác không (tên máy chủ không xác định, không có tuyến đường đến máy chủ, không trả lời). Một số triển khai có thể cần các cờ khác nhau (ví dụ -wthay vì -Wtrên FreeBSD), hãy kiểm tra hướng dẫn trên hệ thống của bạn.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi

Tôi biết đó là những cách nào, tôi chỉ hy vọng đó không phải là cách duy nhất, ngay cả khi những cách khác lạ hoặc hay thay đổi hoặc những gì có bạn. Ồ tốt
dùng67459

2
Câu trả lời này KHÔNG nên được đánh dấu là answeredcâu trả lời. OP đặc biệt yêu cầu more ways to see if a given host is up, ngoài việc ping, câu trả lời này không cung cấp.
Yokai

Từ trang man 'ping':"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134

@ 1111161171159459134 Đoạn đó có thể được diễn đạt tốt hơn. Đó là quá đáng báo động. Bạn không nên thực hiện ping lũ hoặc ping với tốc độ rất cao, nhưng một gói ping bây giờ và sau đó là không đáng kể.
Gilles 'SO- ngừng trở nên xấu xa'

2

Ping thật tuyệt khi nhận được phản hồi nhanh về việc máy chủ có được kết nối với mạng hay không, nhưng nó thường không cho bạn biết máy chủ có còn sống hay không, hoặc liệu nó có còn hoạt động như mong đợi hay không. Điều này là do phản hồi ping thường được xử lý bởi kernel, vì vậy ngay cả khi mọi ứng dụng trên hệ thống bị hỏng (ví dụ do lỗi đĩa hoặc hết bộ nhớ), bạn vẫn sẽ thường xuyên nhận được phản hồi ping và có thể cho rằng máy là Hoạt động bình thường khi tình hình hoàn toàn ngược lại.

Dịch vụ kiểm tra

Thông thường bạn không thực sự quan tâm liệu máy chủ có còn trực tuyến hay không, điều bạn thực sự quan tâm là liệu máy có còn thực hiện một số tác vụ hay không. Vì vậy, nếu bạn có thể kiểm tra nhiệm vụ trực tiếp thì bạn sẽ biết máy chủ đang hoạt động và nhiệm vụ vẫn đang chạy.

Ví dụ, đối với một máy chủ từ xa chạy máy chủ web, bạn có thể làm một cái gì đó như thế này:

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

Nếu nó chạy SSH và bạn có các khóa được thiết lập để đăng nhập không cần mật khẩu, thì bạn có thêm một vài tùy chọn, ví dụ:

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

Điều này hoạt động bằng cách SSH vào máy chủ và chạy truelệnh và sau đó đóng kết nối. Các sshlệnh sẽ chỉ trả lại thành công nếu lệnh mà có thể được chạy thành công.

Kiểm tra từ xa qua SSH

Bạn có thể mở rộng điều này để kiểm tra các quy trình cụ thể, chẳng hạn như đảm bảo rằng nó mysqldđang chạy trên máy:

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

Tất nhiên trong trường hợp này, bạn nên chạy một cái gì đó như monittrên mục tiêu để đảm bảo dịch vụ được chạy, nhưng nó hữu ích trong các tập lệnh mà bạn chỉ muốn thực hiện một số tác vụ trên máy A miễn là máy B sẵn sàng cho nó .

Đây có thể là một cái gì đó giống như kiểm tra xem máy đích có một hệ thống tệp nhất định được gắn trước khi thực hiện rsyncvới nó không, vì vậy bạn không vô tình lấp đầy đĩa chính của nó nếu một hệ thống tệp phụ không gắn kết vì một số lý do. Ví dụ, điều này sẽ đảm bảo rằng nó /mnt/raidđược gắn trên máy đích trước khi tiếp tục.

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

Dịch vụ không có khách hàng

Đôi khi không có cách dễ dàng để kết nối với dịch vụ và bạn chỉ muốn xem liệu nó có chấp nhận các kết nối TCP đến hay không, nhưng khi bạn telnetđến mục tiêu trên cổng được đề cập thì nó chỉ nằm ở đó và không ngắt kết nối với bạn, điều đó có nghĩa là làm điều đó trong một kịch bản sẽ làm cho nó bị treo.

Mặc dù không hoàn toàn sạch sẽ, bạn vẫn có thể làm điều này với sự trợ giúp của các chương trình timeoutnetcat. Ví dụ: kiểm tra này để xem liệu máy có chấp nhận kết nối SMB / CIFS trên cổng TCP không, vì vậy bạn có thể xem liệu nó có đang chạy chia sẻ tệp Windows ngay cả khi bạn không có mật khẩu để đăng nhập hay không, hoặc các công cụ máy khách CIFS không ' cài đặt t:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi
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.