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 true
lệnh và sau đó đóng kết nối. Các ssh
lệ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ư monit
trê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 rsync
vớ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 timeout
và netcat
. 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