Systemd 错误:可执行路径不是绝对的

Pra*_* CM 12 linux upstart systemd init-script redhat-enterprise-linux

我有以下 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
Run Code Online (Sandbox Code Playgroud)

在我尝试运行它的地方,出现以下错误。

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.
Run Code Online (Sandbox Code Playgroud)

我知道这是因为没有 exec 命令的绝对路径,但是由于 exec 作为二进制文件不可用,我不能使用绝对路径。如何让这个 ExecStart 运行?

Fan*_*que 15

您不能exec在 systemd 服务单元配置中使用。
exec是一个shell内置的,不能从文件系统中直接调用(它不存在于文件系统) -type execwhereis exec会告诉你这一点。
使用编写它们的外壳。

例如,如果它是一个bash脚本,您可以像这样运行脚本:

bash /var/RCC/RCClogger.sh
Run Code Online (Sandbox Code Playgroud)

现在,bash是一个可执行文件并且确实有一个绝对路径:/bin/bash. 您的 ExecStart 将如下所示:

ExecStart=/bin/bash /var/RCC/RCClogger.sh
Run Code Online (Sandbox Code Playgroud)

另一种方法是简单地将 a 添加shebang到脚本的开头:

#!/bin/bash
... script code ...
Run Code Online (Sandbox Code Playgroud)

/bin/bash在这种情况下,这会告诉操作系统使用指定的解释器运行文件。

之后,只需使您的脚本可执行:

chmod +x /var/RCC/RCClogger.sh
Run Code Online (Sandbox Code Playgroud)

并将其直接用作ExecStart

ExecStart=/var/RCC/RCClogger.sh
Run Code Online (Sandbox Code Playgroud)


小智 -2

“EXecStart=”需要绝对路径来启动服务。获取 .sh 文件的完整路径并将其附加到 ExecStart 语句。

同样,“联机帮助页”将为您提供详细信息。