python(54) : centos7使用systemd托管python服务, 开启自启, 自动重启

1.效果图

2.说明

一个用于快速将 Python 应用部署为 Linux systemd 服务的自动化脚本工具。

📋 功能特性

  • ✅ 自动生成 systemd 服务配置文件
  • ✅ 自动生成服务控制脚本(启动/停止/重启/查看日志等)
  • ✅ 自动启动服务并设置开机自启
  • ✅ 支持日志管理和监控
  • ✅ 完整的错误检查和友好的提示信息

🔧 系统要求

  • Linux 系统(支持 systemd)
  • Bash Shell
  • sudo/root 权限
  • Python 环境

📖 使用方法

基本语法

./setup_python_service.sh <Python路径> <工作目录> <脚本文件名> <服务名>

参数说明

参数说明示例
Python路径Python 解释器的完整路径/usr/bin/python3
工作目录Python 脚本所在的目录/home/user/myapp
脚本文件名要运行的 Python 脚本文件名app.py
服务名systemd 服务的名称myservice

使用示例

示例 1:部署文件服务
./setup_python_service.sh /usr/bin/python3 /home/file_service file_service_system.py file_service
示例 2:部署 Web 应用
./setup_python_service.sh /usr/bin/python3 /var/www/myapp app.py webapp
示例 3:使用虚拟环境的 Python
./setup_python_service.sh /home/user/myapp/venv/bin/python /home/user/myapp main.py myapp

📁 生成的文件

脚本运行后会自动生成以下文件:

1. systemd 服务文件

  • 位置/etc/systemd/system/<服务名>.service
  • 作用: systemd 服务配置文件
  • 特性:
    • 服务失败时自动重启(Restart=always)
    • 重启间隔 10 秒(RestartSec=10)
    • 日志输出到 systemd journal
    • 以 root 用户运行

2. 控制脚本

  • 位置<工作目录>/service_ctl.sh
  • 作用: 便捷的服务管理脚本
  • 功能: 启动、停止、重启、查看状态和日志等

🎮 控制脚本使用

脚本会在工作目录下生成 service_ctl.sh 控制脚本,使用方法:

# 启动服务
./service_ctl.sh start

# 停止服务
./service_ctl.sh stop

# 重启服务
./service_ctl.sh restart

# 查看服务状态
./service_ctl.sh status

# 查看实时日志
./service_ctl.sh logs

# 启用开机自启
./service_ctl.sh enable

# 禁用开机自启
./service_ctl.sh disable

📊 日志管理

查看实时日志

./service_ctl.sh logs
# 或
sudo journalctl -u <服务名>.service -f

查看最近 100 行日志

sudo journalctl -u <服务名>.service -n 100

查看今天的日志

sudo journalctl -u <服务名>.service --since today

查看指定时间段的日志

sudo journalctl -u <服务名>.service --since "yesterday" --until "today"

查看上次启动的日志

sudo journalctl -u <服务名>.service -b -1

⚠️ 注意事项

  1. 权限要求: 需要 sudo 或 root 权限才能执行此脚本
  2. 路径检查: 脚本会自动检查 Python 路径和脚本文件是否存在
  3. 服务覆盖: 如果同名服务已存在,会被覆盖
  4. 工作目录: 确保 Python 脚本有正确的依赖和配置文件

🔍 故障排查

服务无法启动

  1. 查看详细日志:

    sudo journalctl -u <服务名>.service -n 50
    
  2. 检查 Python 脚本是否能正常运行:

    cd <工作目录>
    <Python路径> <脚本文件名>
    
  3. 检查服务配置:

    sudo systemctl status <服务名>.service
    

权限问题

如果遇到权限问题,检查:

  • 脚本文件是否有执行权限
  • 工作目录的访问权限
  • Python 依赖包是否正确安装

修改服务配置

如需修改服务配置:

  1. 编辑服务文件:

    sudo nano /etc/systemd/system/<服务名>.service
    
  2. 重新加载配置:

    sudo systemctl daemon-reload
    
  3. 重启服务:

    sudo systemctl restart <服务名>.service
    

🗑️ 卸载服务

如需移除服务:

# 停止服务
sudo systemctl stop <服务名>.service

# 禁用服务
sudo systemctl disable <服务名>.service

# 删除服务文件
sudo rm /etc/systemd/system/<服务名>.service

# 重新加载 systemd
sudo systemctl daemon-reload

📝 完整使用流程示例

# 1. 准备 Python 应用
cd /home/myuser
mkdir myapp
cd myapp
# 创建你的 Python 脚本
nano app.py

# 2. 下载部署脚本
# (假设你已经有了 setup_python_service.sh)

# 3. 添加执行权限
chmod +x setup_python_service.sh

# 4. 运行部署脚本
sudo ./setup_python_service.sh /usr/bin/python3 /home/myuser/myapp app.py myapp

# 5. 查看服务状态
./service_ctl.sh status

# 6. 查看实时日志
./service_ctl.sh logs

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License


提示: 使用前请确保充分测试,并根据实际需求调整服务配置。

3.setup_python_service.sh

#!/bin/bash

# ========================================================
# 自动创建 systemd 服务并生成控制脚本
# 用法: ./setup_python_service.sh <工作目录> <Python路径> <脚本文件名> <服务名>
# 示例: ./setup_python_service.sh /usr/bin/python3 /home/file_service file_service_system.py file_service
# ========================================================

if [ "$#" -ne 4 ]; then
    echo "❌ 使用方法错误!"
    echo "用法: $0 <工作目录> <Python路径> <脚本文件名> <服务名>"
    echo "示例: $0 /home/file_service /usr/bin/python3 app.py myservice"
    exit 1
fi

PYTHON_PATH="$1"
WORK_DIR="$2"
SCRIPT_NAME="$3"
SERVICE_NAME="$4"

SCRIPT_PATH="$WORK_DIR/$SCRIPT_NAME"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
CONTROL_SCRIPT="$WORK_DIR/service_ctl.sh"  # 控制脚本输出路径

# 检查文件和路径
if [ ! -f "$SCRIPT_PATH" ]; then
    echo "❌ 错误:脚本文件不存在 -> $SCRIPT_PATH"
    exit 1
fi

if [ ! -x "$PYTHON_PATH" ]; then
    echo "❌ 错误:Python 可执行文件不存在或不可执行 -> $PYTHON_PATH"
    exit 1
fi

# -------------------------------
# 生成 systemd 服务文件
# -------------------------------
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Python Service: $SERVICE_NAME
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=$WORK_DIR
ExecStart=$PYTHON_PATH $SCRIPT_PATH
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=$SERVICE_NAME

[Install]
WantedBy=multi-user.target
EOF

echo "✅ 已生成服务配置文件: $SERVICE_FILE"

# -------------------------------
# 生成控制脚本 service_ctl.sh
# -------------------------------
cat > "$CONTROL_SCRIPT" << EOF
#!/bin/bash
# 控制脚本:$SERVICE_NAME
# 自动生成于 $(date)

SERVICE_NAME="$SERVICE_NAME"

case "\$1" in
    start)
        sudo systemctl start "\$SERVICE_NAME.service"
        echo "▶️  已启动服务: \$SERVICE_NAME"
        ;;
    stop)
        sudo systemctl stop "\$SERVICE_NAME.service"
        echo "⏹️  已停止服务: \$SERVICE_NAME"
        ;;
    restart)
        sudo systemctl restart "\$SERVICE_NAME.service"
        echo "🔄 已重启服务: \$SERVICE_NAME"
        ;;
    status)
        sudo systemctl status "\$SERVICE_NAME.service"
        ;;
    logs)
        echo "📊 实时日志 (\$SERVICE_NAME):"
        sudo journalctl -u "\$SERVICE_NAME.service" -f
        ;;
    enable)
        sudo systemctl enable "\$SERVICE_NAME.service"
        echo "🔔 已启用开机自启: \$SERVICE_NAME"
        ;;
    disable)
        sudo systemctl disable "\$SERVICE_NAME.service"
        echo "🔕 已禁用开机自启: \$SERVICE_NAME"
        ;;
    *)
        echo "📌 用法: \$0 {start|stop|restart|status|logs|enable|disable}"
        echo "示例:"
        echo "  \$0 start     # 启动服务"
        echo "  \$0 status    # 查看状态"
        echo "  \$0 logs      # 查看实时日志"
        exit 1
        ;;
esac

# 日志相关命令
#1. 实时查看服务日志(推荐)
#sudo journalctl -u $SERVICE_NAME.service -f
#-u $SERVICE_NAME.service: 只看这个服务的日志
#-f: 实时追踪(类似 tail -f)

#2. 查看最近 100 行日志
#sudo journalctl -u $SERVICE_NAME.service -n 100

#3. 查看今天的所有日志
#sudo journalctl -u $SERVICE_NAME.service --since today

#4. 查看某段时间的日志(例如昨天)
#sudo journalctl -u $SERVICE_NAME.service --since "yesterday" --until "today"

#5. 查看上次启动的日志(重启服务后很有用)
# sudo journalctl -u $SERVICE_NAME.service -b -1

EOF

# 添加可执行权限
chmod +x "$CONTROL_SCRIPT"
echo "✅ 已生成控制脚本: $CONTROL_SCRIPT"

# -------------------------------
# 部署 systemd 服务
# -------------------------------
systemctl daemon-reload
echo "🔄 已重新加载 systemd 配置"


# 启动并启用服务
systemctl start "$SERVICE_NAME.service"
if systemctl is-active --quiet "$SERVICE_NAME.service"; then
    echo "🟢 服务 $SERVICE_NAME 已成功启动"
else
    echo "❌ 服务启动失败,请运行: sudo journalctl -u $SERVICE_NAME.service"
    exit 1
fi

systemctl enable "$SERVICE_NAME.service"
echo "🔔 服务 $SERVICE_NAME 已设置开机自启"

# 查看服务状态
echo "🔍 服务状态:"
$CONTROL_SCRIPT status

# -------------------------------
# 完成提示
# -------------------------------
echo
echo "🎉 服务部署完成!"
echo "📁 控制脚本位置: $CONTROL_SCRIPT"
echo "💡 使用方法:"
echo "   $CONTROL_SCRIPT start        # 启动"
echo "   $CONTROL_SCRIPT stop         # 停止"
echo "   $CONTROL_SCRIPT restart      # 重启"
echo "   $CONTROL_SCRIPT status       # 状态"
echo "   $CONTROL_SCRIPT logs         # 实时日志"
echo "   $CONTROL_SCRIPT enable/disable # 开机自启控制"

exit 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值