systemd 服务文件如何为 ExecStart 命令分配 chdir

systemd 服务文件如何为 ExecStart 命令分配 chdir

在 Spring Boot 应用程序中,它会查找本地resources文件夹来加载配置。因此,其启动 shell 脚本需要在此文件夹中运行:

x.jar
resources
   |- application.yml
   |- more.yml
startup.sh

我正在写作app.service,但我被困在这里:

[Unit]
Description=service for app
After=syslog.target network.target

[Service]
Type=forking
ExecStart=cd /data/flume; ./control.sh start
ExecReload=cd /data/flume; ./control.sh restart
ExecStop=cd /data/flume; ./control.sh stop
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

可执行路径不是绝对的,忽略:cd /data/flume;/bin/bash startup.sh

有可能在 systemd 中使用它吗Chdir?或者有没有什么好方法可以实现这一点?

答案1

该选项是[Service] WorkingDirectory=

但是无论如何你都必须指定脚本的完整路径——ExecStart 行不是 shell;它们有自己的规则,不同于 shell 命令。

[Service]
ExecStart=/data/flume/control.sh start
WorkingDirectory=/data/flume

(即使在实际的 shell 中,你也不需要进入目录来运行其中的脚本 - 你可以总是./用脚本的完整路径替换。)


最后,很多希望直接启动服务,没有使用任何“control.sh”或“startup.sh”包装器脚本。如果它们设置了环境变量,您也可以在 .service 中设置它们。

相关内容