在 Debian 上监控 FTPServer 状态
一 快速检查与日志定位
二 资源与性能监控
三 持续监控与告警方案
四 一键健康检查脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
FTP_HOST="${1:-127.0.0.1}"
FTP_PORT="${2:-21}"
WARN=3
CRIT=5
FROM="ftp-monitor@$(hostname)"
TO="${3:-admin@example.com}"
SUBJ_OK="[OK] FTP ${FTP_HOST}:${FTP_PORT} healthy"
SUBJ_FAIL="[FAIL] FTP ${FTP_HOST}:${FTP_PORT} check failed"
TMP_ERR=$(mktemp)
cleanup() { rm -f "$TMP_ERR"; }
trap cleanup EXIT
check_service() {
if ! systemctl is-active --quiet vsftpd; then
echo "CRITICAL: vsftpd is not running" >&2
return 1
fi
}
check_port() {
if ! ss -lntp | grep -q ":${FTP_PORT}"; then
echo "CRITICAL: port ${FTP_PORT} not listening" >&2
return 1
fi
}
check_login() {
local user="${4:-ftp}"
local pass="${5:-}"
local timeout=10
if command -v lftp >/dev/null 2>&1; then
if lftp -u "$user,$pass" -p "$FTP_PORT" -e "quit" "ftp://${FTP_HOST}" >/dev/null 2>&1; then
echo "OK: login as ${user} succeeded"
return 0
else
echo "CRITICAL: login as ${user} failed" >&2
return 1
fi
else
echo "WARNING: lftp not installed, skip login test" >&2
return 0
fi
}
main() {
local errors=0
check_service || ((errors++))
check_port || ((errors++))
check_login "$@" || ((errors++))
if (( errors == 0 )); then
echo "$SUBJ_OK"
exit 0
elif (( errors <= WARN )); then
echo "$SUBJ_FAIL: $errors issue(s)" >&2
exit 1
else
echo "$SUBJ_FAIL: $errors issue(s)" >&2
exit 2
fi
}
main "$@"