这个脚本取名 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
然后按以下步骤操作:
- 创建监控服务:
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
- 设置权限:
chmod +x /path/to/monitor.sh
- 启动监控服务:
systemctl daemon-reload
systemctl enable monitor_$SERVICE_NAME
systemctl start monitor_$SERVICE_NAME
这样监控脚本会:
- 每10秒检查一次服务状态
- 如果发现服务停止,会自动尝试重启
- 记录重启时间和状态
- 监控脚本本身如果崩溃也会自动重启
你可以通过以下命令查看监控日志:
journalctl -u monitor_$SERVICE_NAME -f