![Systemd 错误:可执行路径不是绝对的](https://linux22.com/image/1537817/Systemd%20%E9%94%99%E8%AF%AF%EF%BC%9A%E5%8F%AF%E6%89%A7%E8%A1%8C%E8%B7%AF%E5%BE%84%E4%B8%8D%E6%98%AF%E7%BB%9D%E5%AF%B9%E7%9A%84.png)
我有以下的 systemd 代码。
[Unit]
Description=start RCC logger server process
Requires=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service
After=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service
[Service]
ExecStart= exec /var/RCC/RCClogger.sh
Restart=no
[Install]
WantedBy=multi-user.target
当我尝试运行它时,出现以下错误。
Mar 23 04:45:52 localhost.localdomain systemd[1]:
[/etc/systemd/system/rcc_logger.service:7] Executable path is not absolute,
ignoring: exec /v...ogger.sh
Mar 23 04:45:52 localhost.localdomain systemd[1]: rcc_logger.service lacks
both ExecStart= and ExecStop= setting. Refusing.
我知道这是因为 exec 命令没有绝对路径,但由于 exec 不是二进制文件,因此我无法使用绝对路径。如何让这个 ExecStart 运行?
答案1
您不能exec
在 systemd 服务单元配置中使用。
exec
是内置的 shell,不能直接从文件系统调用(它不驻留在文件系统上)——type exec
并将whereis exec
向您展示这一点。
使用它们编写的 shell。
例如,如果它是一个bash
脚本,您可以像这样运行该脚本:
bash /var/RCC/RCClogger.sh
现在,bash
是一个可执行文件,并且有一个绝对路径:/bin/bash
。您的 ExecStart 将如下所示:
ExecStart=/bin/bash /var/RCC/RCClogger.sh
另一种方法是简单地添加一个shebang
到脚本的开头:
#!/bin/bash
... script code ...
/bin/bash
在这种情况下,这会告诉操作系统使用指定的解释器运行该文件。
之后只需让你的脚本可执行:
chmod +x /var/RCC/RCClogger.sh
并直接将其用作ExecStart
:
ExecStart=/var/RCC/RCClogger.sh
答案2
“EXecStart=” 需要绝对路径来启动服务。获取 .sh 文件的完整路径并将其附加到 ExecStart 语句中。
再次,“manpage”将为您提供详细信息。