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
⚠️ 注意事项
- 权限要求: 需要 sudo 或 root 权限才能执行此脚本
- 路径检查: 脚本会自动检查 Python 路径和脚本文件是否存在
- 服务覆盖: 如果同名服务已存在,会被覆盖
- 工作目录: 确保 Python 脚本有正确的依赖和配置文件
🔍 故障排查
服务无法启动
-
查看详细日志:
sudo journalctl -u <服务名>.service -n 50 -
检查 Python 脚本是否能正常运行:
cd <工作目录> <Python路径> <脚本文件名> -
检查服务配置:
sudo systemctl status <服务名>.service
权限问题
如果遇到权限问题,检查:
- 脚本文件是否有执行权限
- 工作目录的访问权限
- Python 依赖包是否正确安装
修改服务配置
如需修改服务配置:
-
编辑服务文件:
sudo nano /etc/systemd/system/<服务名>.service -
重新加载配置:
sudo systemctl daemon-reload -
重启服务:
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

1149

被折叠的 条评论
为什么被折叠?



