Systemd 服务配置中,WorkingDirectory 必须指定为绝对路径且确保目录存在,User 参数应设置为非 root 用户以降低安全风险。若目录权限不足或路径错误,服务将无法启动并报 Permission denied 错误。
先说结论:正确配置工作目录和运行用户是保障服务稳定启动和文件访问权限的基础。
- 适合:所有需要访问特定文件或以特定身份运行的后台服务
- 先准备:创建专用用户账户及对应目录,并调整所有权
- 验收:通过 systemctl status 确认状态及进程用户身份
命令速用版
在 .service 文件的 [Service] 段落中添加以下配置,注意路径必须为绝对路径:
[Service] User=appuser Group=appgroup WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py
配置完成后执行 systemctl daemon-reload 重载配置,再使用 systemctl start 启动服务。
为什么会这样
WorkingDirectory 定义了服务进程启动时的工作目录,影响相对路径文件的读取和日志生成位置。User 参数决定了进程运行的身份权限,限制服务对系统文件的访问范围。若未指定 User,服务默认以 root 运行,存在安全隐患;若 WorkingDirectory 不存在或用户无权限,进程启动时会因无法切换目录而失败。
分步处理
第一步:创建专用用户和组。使用 useradd 命令创建系统用户,避免使用登录 shell。
第二步:创建应用目录并授权。mkdir 创建目录后,使用 chown 将目录所有者设为上述用户。
第三步:编写单元文件。在/etc/systemd/system/下创建.service 文件,填入 User 和 WorkingDirectory 参数。
第四步:重载并启动。执行 systemctl daemon-reload 使配置生效,随后启动服务。
怎么验证是否生效
使用 systemctl status 查看服务状态,确认 Active 为 active (running)。使用 ps -o user,cmd -p 命令配合主进程 PID 查看进程实际运行用户。使用 journalctl -u 服务名查看日志,确认无 Permission denied 报错。
常见坑
WorkingDirectory 不能使用~或相对路径,必须写全路径如/home/user/app。目录必须在服务启动前存在,systemd 不会自动创建该目录。指定 User 后,该用户必须对 WorkingDirectory 及 ExecStart 指向的文件有执行和读取权限。
常见问题
WorkingDirectory 可以写相对路径吗
不可以,systemd 要求 WorkingDirectory 必须使用绝对路径,否则服务无法启动。
如何确认服务实际以哪个用户运行
使用 ps -o user= -p 命令查询主进程 PID,或查看 systemctl status 输出中的 CGroup 信息。
修改配置后服务未更新怎么办
修改单元文件后必须执行 systemctl daemon-reload,否则 systemd 仍沿用旧配置。
参考来源
- AutoLaunch 项目中的 systemd 用户服务配置问题解析
- 【技术分享】Systemd 原生服务配置最佳实践 (下)
- Linux 如何配置 systemd 单元文件
- systemd 的 unit 配置文件里 [Service] 里的 WorkingDirectory 有什么用,如何配置 - dirgo - 博客园
- Linux CentOS 系统,Systemd 配置文件模板和使用说明,设置 MinIO Systemd 服务管理实例
- Systemd 服务完全指南:从入门到生产实践