WorkingDirectory用于指定服务启动时的工作目录,必须为存在的绝对路径,运行用户需有访问权限,它影响ExecStart命令的执行上下文,等价于先cd再执行。

直接在 service 文件的 [Service] 段写上 WorkingDirectory= 并指定绝对路径,就能让服务进程启动时自动切换过去——但前提是路径存在、权限正确,且服务本身确实依赖这个目录。
必须用绝对路径,且目录得真实存在
systemd 不接受相对路径或波浪号(~),比如 WorkingDirectory=~/app 或 WorkingDirectory=./myapp 都会失败。它只认完整路径,例如:
WorkingDirectory=/opt/mywebappWorkingDirectory=/srv/node-redWorkingDirectory=/var/lib/backup-script
如果目录不存在,systemd 启动时会报错:chdir() to working directory failed,服务直接退出。
运行用户必须有访问权限
WorkingDirectory 不仅要存在,还要能让 User= 指定的用户进去读写(至少可执行 x 权限)。常见问题包括:
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
- 目录属主是 root,但
User=www-data无法进入 - 目录权限为
700,其他用户被拒绝 - SELinux 或 AppArmor 限制了路径访问(需额外策略)
建议提前用命令验证:
sudo -u www-data ls -l /opt/myapp —— 能列出内容,说明路径和权限都 OK。
它影响的是 ExecStart 命令的执行上下文
WorkingDirectory 只对 ExecStart 所执行的主命令生效,相当于先 cd /path 再运行命令。比如:
[Service] WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 app.py
等价于手动执行:cd /opt/myapp && python3 app.py。这意味着:
-
app.py里用open("config.yaml")就会去找/opt/myapp/config.yaml -
subprocess.run(["./helper.sh"])会执行/opt/myapp/helper.sh -
__file__在 Python 中仍是绝对路径,但当前工作目录变了
Nginx 是个特例:通常不用设
Nginx 几乎不依赖 WorkingDirectory,因为所有路径(pid、error_log、client_body_temp_path 等)都在 nginx.conf 里用绝对路径写死。即使你加了 WorkingDirectory=/etc/nginx,只要配置没用相对路径,就毫无效果。真要设,也应指向其 --prefix 目录(如 /usr/share/nginx),并确保 nginx 用户能访问。

















