systemd服务执行失败:Debian系桌面启动Python应用遇问题
Systemd服务启动Python桌面应用失败排查指南
系统环境
- 基于Debian的Linux系统,版本:
Linux 6.2.15-lux-amd64 #2 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
现有配置
1. todo_service.service 文件
[Unit] Description=init_todo_app [Service] ExecStart=/bin/sh /etc/systemd/system/init_script_caller.sh [Install] WantedBy=multi-user.target
2. init_script_caller.sh 脚本
#!/bin/sh PATH_EXEC=/path_to/init.sh ${PATH_EXEC}
3. init.sh 启动脚本
#!/bin/sh ACTUAL_FOLDER=/folder/to_app_root . "${ACTUAL_FOLDER}/env/bin/activate" python3 "${ACTUAL_FOLDER}/src/main.py" "minimize"
已执行操作
chmod 755 init.sh chmod 755 init_script_caller.sh chmod 755 todo_service.service sudo cp -p todo_service.service /etc/systemd/system/todo_service.service sudo cp -p init_script_caller.sh /etc/systemd/system/init_script_caller.sh systemctl enable --now todo_service.service
问题现象
手动在/etc/systemd/system/目录执行./init_script_caller.sh可正常启动应用,但通过systemd启动服务失败,执行systemctl status todo_service.service返回:
todo_service.service - init_todo_app Loaded: loaded (/etc/systemd/system/todo_service.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sun 2024-02-18 10:08:43 -03; 7min ago Process: 293266 ExecStart=/bin/sh /etc/systemd/system/init_script_caller.sh (code=exited, status=1/FAILURE) Main PID: 293266 (code=exited, status=1/FAILURE) CPU: 259ms
排查步骤
查看完整启动日志:执行
journalctl -u todo_service.service -xe,这条命令会输出服务启动的所有细节,包括脚本执行时的错误提示(如文件路径错误、权限不足、环境变量缺失等),是定位问题的核心手段。验证路径与权限:
确认init_script_caller.sh中/path_to/init.sh是正确的绝对路径,并且该路径对systemd默认运行用户(root)具备读和执行权限。手动执行时用的是当前用户权限,systemd服务的权限环境可能不同。适配桌面环境需求:
桌面应用依赖X窗口环境变量,而multi-user.target是无桌面的多用户模式,服务启动时无法获取DISPLAY等关键变量。可以:- 将service文件的
WantedBy=multi-user.target改为WantedBy=graphical.target,确保服务在桌面环境启动后再运行; - 在
[Service]段添加Environment=DISPLAY=:0(根据你的桌面显示编号调整),或者添加User=你的用户名,让服务以普通用户身份运行,匹配手动执行的环境。
- 将service文件的
简化服务配置:
去掉中间的init_script_caller.sh,直接在service文件中调用虚拟环境的Python执行脚本,减少出错环节。示例配置:
[Unit] Description=init_todo_app After=graphical.target [Service] User=你的用户名 WorkingDirectory=/folder/to_app_root ExecStart=/folder/to_app_root/env/bin/python3 /folder/to_app_root/src/main.py minimize Restart=on-failure [Install] WantedBy=graphical.target
- 启用脚本调试模式:
在init.sh开头添加set -x,重新启动服务后查看日志,脚本每一步的执行都会被打印,便于定位具体出错步骤:
#!/bin/sh set -x ACTUAL_FOLDER=/folder/to_app_root . "${ACTUAL_FOLDER}/env/bin/activate" python3 "${ACTUAL_FOLDER}/src/main.py" "minimize"
内容的提问来源于stack exchange,提问作者caio maxximus
相关产品推荐
相关产品推荐

