systemd单元文件里的WorkingDirectory ExecStart解释

WorkingDirectory含义

xx.service[Service] 段里,

1
2
[Service]
WorkingDirectory=/data/monitor

它的意思是:

  • 在启动 ExecStart 前,把进程的当前工作目录 (cwd) 切换到这里
  • 这样,服务里执行的相对路径命令、日志文件、配置文件等,都会以该目录为基准。

等效于在启动命令前加了:

1
cd /data/monitor && <ExecStart command>

使用场景

  1. 程序依赖相对路径

    • 比如 ExecStart=./bin/myapp,如果没有 WorkingDirectory,systemd 默认工作目录是 /,就会报错。
    • 加上 WorkingDirectory=/data/myapp 后,就能正常运行。

ExecStart 第一个参数必须是绝对路径

  1. 日志/文件输出

    • 程序写日志到 ./logs/app.log,有了 WorkingDirectory=/var/log/myapp,日志就会正确落在该目录下。
  2. 隔离运行环境

    • 保证程序不在 / 下乱写文件,规范化目录。

默认值

如果不写 WorkingDirectory,systemd 启动进程时的工作目录就是 /
这就会导致:

  • 进程使用相对路径时找不到文件
  • 日志输出位置不对

生产配置例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Prometheus Monitoring
After=network.target

[Service]
User=prometheus
Group=prometheus
WorkingDirectory=/data/monitor/prometheus
ExecStart=/data/monitor/prometheus/prometheus \
--config.file=prometheus.yml \
--storage.tsdb.path=data/ \
--web.listen-address=:9090
Restart=on-failure

[Install]
WantedBy=multi-user.target

这样:

  • 进程工作目录在 /data/monitor/prometheus
  • --storage.tsdb.path=data/ 实际写入 /data/monitor/prometheus/data
  • 日志输出 ./xxx.log 时也会落在该目录下

systemd 提示:ExecStart 的可执行路径必须是绝对路径,否则会忽略