一键搞定!创建一个在Ubuntu上自动将python程序部署为服务的脚本,包含虚拟环境,运行监控,失败重启服务

这个脚本取名 deploy.sh

#!/bin/bash

# 定义变量
SCRIPT_NAME="boll_alert"  # 替换为你的Python脚本名称,不含.py后缀
VENV_NAME="venv"  # 虚拟环境名称
USERNAME="root"  # 默认为root用户
SERVICE_NAME="boll_alert"  # 自定义服务名称

# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户运行此脚本"
  exit 1
fi

# 获取脚本名称
if [ -z "$1" ]; then
    SERVICE_NAME=$SCRIPT_NAME
else
    SERVICE_NAME=$1
fi

# 检查是否存在同名的服务
if systemctl list-units --type=service --state=active --state=inactive --state=deactivating --state=failed --state=activating | grep -q "$SERVICE_NAME.service"; then
    echo "已存在同名的服务:$SERVICE_NAME.service"
    read -p "是否要删除之前的服务?(y/n): " -n 1 -r
    echo    # 移动到新行
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        systemctl stop $SERVICE_NAME.service
        systemctl disable $SERVICE_NAME.service
        rm /etc/systemd/system/$SERVICE_NAME.service
        systemctl daemon-reload
        echo "已删除之前的服务:$SERVICE_NAME.service"
    else
        echo "部署已取消。"
        exit 1
    fi
fi

# 安装必要的软件包
echo "正在安装必要的软件包..."
apt-get update && apt-get install -y python3-pip python3-venv

# 创建虚拟环境在当前脚本目录下
echo "创建虚拟环境..."
python3 -m venv ./$VENV_NAME

# 激活虚拟环境并安装依赖
echo "激活虚拟环境并安装依赖..."
source ./$VENV_NAME/bin/activate
pip install -r ./requirements.txt
deactivate

# 创建启动脚本
cat <<EOF > ./run.sh
#!/bin/bash
source ./$VENV_NAME/bin/activate
python3 $SCRIPT_NAME.py
EOF
chmod +x ./run.sh

# 创建Systemd服务文件
cat <<EOF > /etc/systemd/system/$SERVICE_NAME.service
[Unit]
Description=$SERVICE_NAME Service
After=network.target

[Service]
Type=simple
User=$USERNAME
WorkingDirectory=$(pwd)
ExecStart=/bin/bash $(pwd)/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动服务
systemctl enable $SERVICE_NAME.service
systemctl start $SERVICE_NAME.service

# 检查服务状态
systemctl status $SERVICE_NAME.service

echo "部署完成,$SERVICE_NAME 服务已经设置为开机自启动并在后台运行。"

如果需要监控boll_alert这个服务,当boll_alert意外停止后就重启这个服务,我们可以创建一个监控脚本monitor.sh,内容如下:

#!/bin/bash

SERVICE_NAME="boll_alert"  # 替换为你的服务名称

while true; do
    # 检查服务状态
    if ! systemctl is-active --quiet $SERVICE_NAME; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务 $SERVICE_NAME 已停止,正在尝试重启..."
        systemctl restart $SERVICE_NAME
        
        # 等待几秒确认服务是否成功重启
        sleep 5
        
        if systemctl is-active --quiet $SERVICE_NAME; then
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务 $SERVICE_NAME 重启成功"
        else
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务 $SERVICE_NAME 重启失败"
        fi
    fi
    
    # 等待10秒后继续检查
    sleep 10
done

然后按以下步骤操作:

  1. 创建监控服务:
cat <<EOF > /etc/systemd/system/monitor_$SERVICE_NAME.service
[Unit]
Description=Monitor for $SERVICE_NAME Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/bin/bash /path/to/monitor.sh
Restart=always

[Install]
WantedBy=multi-user.target
EOF
  1. 设置权限:
chmod +x /path/to/monitor.sh
  1. 启动监控服务:
systemctl daemon-reload
systemctl enable monitor_$SERVICE_NAME
systemctl start monitor_$SERVICE_NAME

这样监控脚本会:

  • 每10秒检查一次服务状态
  • 如果发现服务停止,会自动尝试重启
  • 记录重启时间和状态
  • 监控脚本本身如果崩溃也会自动重启

你可以通过以下命令查看监控日志:

journalctl -u monitor_$SERVICE_NAME -f

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

87 + = 96