脚本用于监控和报告本地或远程主机上网络服务的状态。利用netstat命令或其他网络探测工具来获取服务信息,并输出服务是否正常运行的结果。
功能:
服务检测: 检查指定端口上的服务是否正在运行。
状态报告: 输出每个服务的状态,包括“运行中”、“未运行”等。
日志记录: 记录服务状态变化的日志,便于后续分析。
/data/python/NetstatMonitor.py
#!/usr/bin/python3
# Usage(for Debug): nohup python3 /data/python/NetstatMonitor.py > /dev/null 2>&1 &
from flask import Flask, render_template_string, request
from flask_httpauth import HTTPBasicAuth
from werkzeug.security import generate_password_hash, check_password_hash
import subprocess
import logging
app = Flask(__name__)
auth = HTTPBasicAuth()
# 用户名和密码哈希
users = {
"Richard": generate_password_hash("xxx")
}
# 配置日志
logging.basicConfig(filename='/var/log/netstat_monitor.log', level=logging.INFO,
format='%(asctime)s %(levelname)s: %(message)s')
@auth.verify_password
def verify_password(username, password):
if username in users and \
check_password_hash(users.get(username), password):
# 记录成功的登录尝试
logging.info(f"{request.remote_addr} authenticated as {username}")
return username
else:
# 记录失败的登录尝试
logging.warning(f"{request.remote_addr} failed to authenticate as {username}")
return None
@app.route('/')
@auth.login_required
def index():
# 执行 netstat 命令并获取输出
netstat_output = subprocess.check_output(['netstat', '-anptul']).decode('utf-8')
# 构建 HTML 页面
html = f"""
<html>
<head><title>NetstatMonitor.Service</title></head>
<body>
<h1>Welcome, {auth.current_user()}!</h1>
<pre>{netstat_output}</pre>
</body>
</html>
"""
# 记录成功的页面访问
logging.info(f"{request.remote_addr} accessed the page")
return html
if __name__ == '__main__':
# 配置 SSL 证书
context = ('/etc/nginx/xxx.pem', '/etc/nginx/xxx.key')
# 运行 Flask 应用程序
app.run(ssl_context=context, host='0.0.0.0', port=18271)
使用 Supervisor 托管 python 任务运行
Supervisor 的主配置文件通常位于/etc/supervisor/supervisord.conf,创建一个服务配置文件/etc/supervisor/conf.d/NetstatMonitor.conf
root@Dev-Debian11-LosAngeles-America2:~# cat /etc/supervisor/conf.d/NetstatMonitor.conf
[program:NetstatMonitor]
command=python3 /data/python/NetstatMonitor.py
autorstart=true
autorestart=true
startsecs=5
startretries=100
stdout_logfile=/var/log/NetstatMonitor.py.supervisor.log
stdout_logfile_maxbytes=100MB
root@Dev-Debian11-LosAngeles-America2:~# systemctl restart supervisor.service
root@Dev-Debian11-LosAngeles-America2:~# supervisorctl status
NetstatMonitor STARTING