linux定时重启
2025/6/27大约 2 分钟
linux定时重启
systemctl
- sh脚本启动程序,替换为自己的脚本
#!/bin/bash
DIR="$(cd "$(dirname "$0")" && pwd)"
nohup "$DIR"/../Go/ginSprider/main > "$DIR"/app.log 2>&1 &
echo $! > "$DIR"/app.pid- 利用python脚本启动sh文件
#!/usr/bin/env python3
import subprocess
import time
import os
import signal
import socket
from datetime import datetime
# ==== 配置项 ====
BASE_DIR = "/home/gl/Code/Shell" # 改成你 restart.py 所在的目录
JAVA_COMMAND = f"/usr/bin/sh {BASE_DIR}/start.sh"
APP_PORT = 8008 # 修改为你的 Java 程序监听端口
PID_FILE = os.path.join(BASE_DIR, "app.pid")
LOG_FILE = os.path.join(BASE_DIR, "restart.log")
MAX_RETRIES = 3 # 重试3次后停止
RETRY_INTERVAL = 60 # 停止多少秒,后重试 程序启动慢的药提高
STARTUP_WAIT_TIME = 60 # 每次启动后等待几秒再检测
# ==== 日志记录 ====
def log(message):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(LOG_FILE, 'a') as f:
f.write(f"[{timestamp}] {message}\n")
# ==== 检查进程是否存在 ====
def is_process_running(pid):
try:
os.kill(pid, 0)
return True
except Exception:
return False
# ==== 检查端口是否可用 ====
def is_port_open(port, host='127.0.0.1'):
try:
with socket.create_connection((host, port), timeout=2):
return True
except Exception:
return False
# ==== 停止旧进程 ====
def stop_java_process():
if os.path.exists(PID_FILE):
with open(PID_FILE, 'r') as f:
pid = int(f.read())
log(f"开始停止pid为: {pid} ,的进程")
try:
os.kill(pid, signal.SIGTERM)
time.sleep(3)
except ProcessLookupError:
log("未找到进程可能以停止.")
os.remove(PID_FILE)
else:
log("没有PID文件,无法停止进程.")
# ==== 启动 Java 并验证 ====
def start_java_process():
for attempt in range(1, MAX_RETRIES + 1):
log(f"尝试启动 第 ({attempt}) 次")
proc = subprocess.Popen(JAVA_COMMAND.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
time.sleep(STARTUP_WAIT_TIME)
with open(PID_FILE, 'r') as f:
real_pid = int(f.read())
if is_process_running(real_pid):
if is_port_open(APP_PORT):
log(f"成功启动进程 pid: {real_pid} port: {APP_PORT}")
return True
else:
log(f"PID {real_pid} 正在运行, 端口 {APP_PORT} 关闭. 重试...")
proc.terminate()
else:
log("重试后进程没有运行.")
time.sleep(RETRY_INTERVAL)
log("警告:重试多次后启动失败.")
return False
# ==== 主流程 ====
if __name__ == "__main__":
stop_java_process()
success = start_java_process()
if not success:
log("警告:启动失败.")- 编写systemctl文件执行python脚本
sudo vim /etc/systemd/system/restart-java.service
[Unit]
Description=Restart Java App
[Service]
Type=oneshot
WorkingDirectory=/home/gl/Code/Shell
ExecStart=/usr/bin/python3 /home/gl/Code/Shell/restart.py- 编写system timer文件 每天执行一次
sudo vim /etc/systemd/system/restart-java.timer
[Unit]
Description=Daily restart at 0AM
[Timer]
OnCalendar=*-*-* *:*:00
Persistent=true
[Install]
WantedBy=timers.target
-------------------------------------
#reload服务
sudo systemctl daemon-reload\nsudo systemctl enable --now restart-java.timer
#查看列表
systemctl list-timers
#查看服务日志
journalctl -u restart-java.service- 查看日志
- restart.log 是restart.py执行记录的日志
- app.pid 是当前服务的id
- app.log 是被启动程序的日志
cron定时
- 前两部与上相同
- ...
- 编写cron
crontab -e
* * * * * /usr/bin/python3 /home/gl/Code/Shell/restart.py
sudo systemctl restart cron