我创建了这个脚本:
[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
但是当我运行它时,它显示:
Process: 8986 ExecStart=/somescript.sh (code=exited, status=203/EXEC)
我理解此消息意味着找不到脚本...为什么工作目录对我来说不起作用?
谢谢。
答案1
systemdWorkingDirectory=
环境定义服务将在哪个目录上启动,与cd
您在 shell 中工作时更改目录时使用的方式相同。
这并不意味着所有其他路径(包括来自的路径ExecStart=
)现在都与它相关,因此您仍然需要在该指令中完整指定脚本的路径:
ExecStart=/home/someuser/somescript.sh
也许你正在考虑RootDirectory=
指示而不是?该目录使用命令chroot
将进程看到的文件系统的根目录切换到您指定的目录,因此从您/
对脚本位置的使用来看,这看起来可能是您想要的……但是,使用RootDirectory=
需要您有一个系统映像,其中包含二进制文件和库。例如,您需要有一个/bin/sh
来运行您的 shell 脚本,以及一个/lib
带有 libc 的目录等。通常,您不能随便使用RootDirectory=
您喜欢的任何目录……
因此,为了解决您看到的问题,我建议只需更新以ExecStart=
列出脚本的完整路径。
答案2
我发现相对路径有效,但你使用的是绝对ExecStart 的路径。它不是在寻找/home/someuser/somescript.sh
,而是在寻找/somescript.sh
它正在查找根目录下的文件。但文件根本不在那里,所以失败了。
您可以通过改变来使其工作ExecStart=somescript.sh
从:https://www.freedesktop.org/software/systemd/man/systemd.service.html
对于每个指定的命令,第一个参数必须是可执行文件的绝对路径或不带任何斜杠的简单文件名。
答案3
这也有效:
WorkingDirectory=/home/someuser
ExecStart=/bin/bash -c './somescript.sh'