文章

结合 uptime 实现服务挂了重启服务

uptime的监控里面有很多自定义的选项,可惜没法实现自动重启服务,今天介绍一个方法能够连锁反应实现自动重启服务恢复。

image-20251018232724395

在服务器编写一个Python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from flask import Flask, jsonify
import subprocess
import shlex

app = Flask(__name__)

# 替换为你要执行的单个命令(例如:重启容器命令)
COMMAND = "echo 'hello'"  # 这里写你的命令

@app.route('/restart', methods=['GET','POST'])
def run_command():
    try:
        # 执行命令并捕获输出
        result = subprocess.run(
            shlex.split(COMMAND),
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        return jsonify({"status": "success", "output": result.stdout}), 200
    except Exception as e:
        return jsonify({"status": "error", "msg": str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=4000, debug=False)

将程序注册为服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=API Service to Execute Command

[Service]
User=root
WorkingDirectory=/opt/monitor_script
ExecStart=/usr/bin/python3 /opt/monitor_script/cmd_api.py
Restart=always
RestartSec=5
StandardOutput=append:/var/log/cmd-api.log
StandardError=append:/var/log/cmd-api.log

[Install]
WantedBy=multi-user.target

设置为开机自启动即可:

1
systemctl enable cmd-api.service --now

最后创建一个webhook的通知能够调用这个api就可以实现我们的目标了。

本文由作者按照 CC BY 4.0 进行授权