在启动 systemd 服务之前执行 chdir

Mar*_*rio 172 systemd

问题:我可以使用 systemd 启动一个进程并为该进程指定一个我选择的工作目录吗?

我有一项我想开始的服务systemd。当该服务启动时,我希望能够为其分配一个当前工作目录。如果我正在使用init,我知道该怎么做,但是我在使用systemd.

这就是我一直在努力工作的内容。

我的服务

我创建了一个简单的实用程序(“listdir”),用 Python 编写,并放置在/opt/bin/listdir

#! /usr/bin/python

import os

print 'Current working directory: %s' % (os.getcwd())
Run Code Online (Sandbox Code Playgroud)

我的配置文件

然后我创建了一个listdir.service文件systemd并将它放在这里/lib/systemd/system/listdir.service

[Unit]
Description=Test of listing CWD.

[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

问题

当我运行systemctl start listdir我的系统日志时,将根目录(“/”)记录为当前工作目录。当然,我期望/usr/local作为当前目录,因为我认为ExecStartPre在开始该过程之前会更改目录。

显然,我想象它systemd会像 shell 脚本一样工作(即使我知道它不是 shell 脚本)。有人可以让我知道我应该做什么吗?甚至可以使用systemd? 谢谢!


编辑:我的系统日志报告错误。(我刚注意到。)

Executable path is not absolute, ignoring: chdir /usr/local 
Run Code Online (Sandbox Code Playgroud)

所以,chdir是一个shell命令,而不是一个可执行文件本身。好的。但是我还有什么方法可以使用 更改目录systemd吗?

Eri*_*ouf 309

在 systemd >= 227 上,您应该能够使用:

[Service]
WorkingDirectory=/usr/local
Run Code Online (Sandbox Code Playgroud)

让你的脚本在那里执行。

文档

  • 你是怎么找到这个的?[文档](https://www.freedesktop.org/software/systemd/man/systemd.service.html) 中的任何地方都没有提到它! (5认同)
  • @EricRenouf 啊哈,他们应该在服务文档中复制那些共享选项 (4认同)
  • 回答我自己,它适用于最新的 CentOS 7,尽管版本不同。 (4认同)
  • @jameshfisher 它在 [文档的这一部分](https://www.freedesktop.org/software/systemd/man/systemd.exec.html) (3认同)
  • 所以只是为了清楚起见,这会放在`[Service]` 部分吗? (3认同)