如何检测环境变量变化并重启CPanel中的Python应用?
在CPanel中检测环境变量变化并重启Python应用
方案1:监控脚本+CPanel进程管理
写个Python脚本定时对比环境变量快照,发现变化就触发应用重启:
import os import time import subprocess from datetime import datetime # 保存初始环境变量快照 initial_env = dict(os.environ) def has_env_changed(): current_env = dict(os.environ) # 检查已有变量值是否变更 for key, val in initial_env.items(): if current_env.get(key) != val: return True # 检查是否新增环境变量 for key in current_env: if key not in initial_env: return True return False def restart_my_app(): # 替换为你在CPanel中启动应用的实际命令 # 若用Passenger部署,直接执行touch tmp/restart.txt即可触发重启 subprocess.run(["pkill", "-f", "your_main_app.py"], check=False) time.sleep(2) subprocess.run(["python3", "/home/your_username/app/your_main_app.py"], shell=True) print(f"{datetime.now()}: 环境变量变更,应用已重启") if __name__ == "__main__": while True: if has_env_changed(): restart_my_app() # 更新快照,避免重复触发重启 initial_env = dict(os.environ) time.sleep(60) # 每分钟检查一次,可按需调整间隔
- 将脚本放到应用目录,要么用
nohup python3 monitor.py &让它后台持续运行,要么在CPanel的Cron Jobs中设置为每分钟执行一次(注意Cron默认环境变量有限,需在脚本开头手动加载应用的环境配置,比如source /home/your_username/.bashrc)。 - 若是Passenger部署的应用,把
restart_my_app里的命令换成subprocess.run(["touch", "/home/your_username/app/tmp/restart.txt"])即可,这是Passenger官方的标准重启方式。
方案2:Passenger+环境变量文件(更省心)
如果你的应用基于Passenger部署,可将环境变量统一放到.env文件中管理:
- 在Python应用中加载
.env文件:
from dotenv import load_dotenv load_dotenv() # 读取.env中的环境变量
- 写个bash脚本监控
.env文件的修改时间:
#!/bin/bash ENV_FILE="/home/your_username/app/.env" LAST_CHECK_FILE="/home/your_username/app/.last_env_check" # 首次运行时记录当前时间 if [ ! -f "$LAST_CHECK_FILE" ]; then date +%s > "$LAST_CHECK_FILE" exit 0 fi # 对比文件修改时间与上次检查时间 MODIFIED_TIME=$(stat -c %Y "$ENV_FILE") LAST_CHECK_TIME=$(cat "$LAST_CHECK_FILE") if [ "$MODIFIED_TIME" -gt "$LAST_CHECK_TIME" ]; then # 触发Passenger重启 touch /home/your_username/app/tmp/restart.txt # 更新检查时间 date +%s > "$LAST_CHECK_FILE" echo "应用因.env更新重启于$(date)" fi
- 在CPanel的Cron Jobs中添加该脚本,设置为每分钟执行一次,只要
.env文件内容修改,应用就会自动重启。
注意事项
- 确保脚本拥有足够权限读取环境变量、修改文件或执行进程命令。
- 若使用Cron执行脚本,需注意Cron的环境变量与应用运行环境的差异,必要时在脚本中手动加载环境配置。
- 对于后台运行的Python监控脚本,可通过CPanel的Process Manager托管,防止意外退出。
内容的提问来源于stack exchange,提问作者omer
相关产品推荐
相关产品推荐

