workingdirectory用于指定服务进程启动时的工作目录,影响相对路径解析、文件读写、模块加载及安全性;必须为绝对路径,目录需存在且运行用户有访问权限。

直接在服务单元文件的 [Service] 段里写 WorkingDirectory=,并确保路径存在、权限正确、用绝对路径。
WorkingDirectory 的作用很实在
它不是可有可无的设置,而是决定了服务启动后“站在哪”:
- 所有相对路径(比如
./config.yaml、logs/app.log)都以此目录为起点 - Python 的
import、Node.js 的require()会从这里找模块 - 程序读取的默认配置文件、写入的日志或临时文件,都落在此处
- 配合
User=和ProtectHome=true等选项,能缩小服务的文件系统可见范围,提升安全性
配置时必须遵守的规则
写错会导致服务启动失败,常见错误就出在这几条上:
- 只能填绝对路径,不能写
~/myapp或../app - 目录必须事先创建好,systemd 不会自动创建(否则报
Failed at step CHDIR spawning) - 指定的
User=必须对该目录有读、执行权限(至少要有x才能进入目录) - 支持有限变量,比如
%h表示用户家目录,%u表示用户名,如WorkingDirectory=/home/%u/myapp
实际配置示例
假设你有个 Python 脚本放在 /opt/mybot/main.py,依赖同目录下的 settings.py 和 data/ 文件夹:
[Service] WorkingDirectory=/opt/mybot ExecStart=/usr/bin/python3 /opt/mybot/main.py User=mybot
这样脚本运行时当前目录就是 /opt/mybot,import settings 和 open("data/cache.json") 都能正常工作。
验证是否生效
服务启用并启动后,可以用这条命令确认工作目录是否按预期设置:
-
systemctl show mybot.service -p WorkingDirectory(查配置值) -
systemctl status mybot.service(看有没有启动失败提示) -
sudo systemctl exec mybot -- pwd(部分新版 systemd 支持,直接进进程查当前路径) - 或者查看日志:
journalctl -u mybot -n 20,看是否有路径相关的报错











