Systemd 服务,工作目录不会改变目录

Roi*_*iel 20 services systemd 18.04

我创建了这个脚本:

[Unit]
Description=test

[Service]
WorkingDirectory=/home/someuser
ExecStart=/somescript.sh

Restart=always
RestartSec=10

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=autodeploy

Environment=NODE_ENV=production PORT=1494

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

但是当我运行它时,它说:

Process: 8986 ExecStart=/somescript.sh (code=exited, status=203/EXEC)
Run Code Online (Sandbox Code Playgroud)

我明白这条消息意味着找不到脚本......为什么工作目录对我不起作用?

谢谢。

fil*_*den 31

systemdWorkingDirectory=设置定义了服务将在哪个目录上启动,这与cd您在 shell 中工作时用来更改目录时使用的相同。

这并不意味着所有其他路径(包括 from ExecStart=)现在都将与它相关,因此您仍然需要在该指令中完全指定脚本的路径:

ExecStart=/home/someuser/somescript.sh
Run Code Online (Sandbox Code Playgroud)

也许您正在考虑该RootDirectory=指令?该目录使用该chroot命令通过您指定的目录切换进程看到的文件系统的根目录,因此从您/对脚本位置的使用来看,这看起来可能是您想要的......但是,使用RootDirectory=需要您有一个系统映像,其下有二进制文件和库。就像,你需要有一个/bin/sh来运行你的 shell 脚本,一个/lib带有 libc 等。通常你不能只使用RootDirectory=你喜欢的任何目录......

因此,为了解决您所看到的问题,我的建议是更新ExecStart=以列出脚本的完整路径。


小智 30

我发现相对路径有效,但您对 ExecStart使用绝对路径。它不是在寻找/home/someuser/somescript.sh,而是在寻找/somescript.sh,即在根目录下寻找文件。那根本不是文件所在的位置,因此失败。

你也许可以通过改变来让它工作ExecStart=somescript.sh


来自: https: //www.freedesktop.org/software/systemd/man/systemd.service.html

对于每个指定的命令,第一个参数必须是可执行文件的绝对路径或不带任何斜杠的简单文件名。

  • 有趣的是,这实际上是问题的正确答案。虽然@filbranden 的答案非常好,但它实际上并不是问题的答案。投上一票,你应得的。 (4认同)
  • 相对路径*不适用于 Systemd 运行的二进制文件。但是,该二进制文件一旦运行,就可以对传递给它的参数执行任何操作,例如将它们视为相对路径。 (3认同)