systemd 服务文件中的 $OPTIONS 是什么?

che*_*rdt 5 systemd

我正在查看/usr/lib/systemd/system/sshd.serviceFedora 25 机器上文件中的以下行:

ExecStart=/usr/sbin/sshd -D $OPTIONS
Run Code Online (Sandbox Code Playgroud)

我不确定$OPTIONS从哪里来。它看起来像一个环境变量,尽管当我以这种方式设置 shell 变量时,它会被忽略,例如

# OPTIONS='-p 9999'
# systemctl start sshd
Run Code Online (Sandbox Code Playgroud)

我通读了 systemd.service 手册页的命令行部分,这表明可以通过Environment一行设置环境变量:

Environment="ONE=one" 'TWO=two two'
Run Code Online (Sandbox Code Playgroud)

但是,那里没有设置这样的 OPTIONS 变量。

另外还有EnvironmentFile一行,例如:

EnvironmentFile=-/etc/sysconfig/sshd
Run Code Online (Sandbox Code Playgroud)

$OPTIONS那里也没有设置变量。$OPTIONS指的是什么,它是如何设置的?

ilk*_*chu 6

Debian 中的单元文件类似,包含:

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Run Code Online (Sandbox Code Playgroud)

在这里, EnvironmentFile 分配SSHD_OPTS

# Options to pass to sshd
SSHD_OPTS=
Run Code Online (Sandbox Code Playgroud)

Fedora 很可能使用了类似的系统,但出于某种原因,他们只是没有明确设置该变量。没关系,它应该扩展为空字符串。

有一个提到这里是如httpd.service采用OPTIONS类似,并设置它/etc/sysconfig/httpd。所以它可能只是出于某种原因未设置。

您可以检查sshd的命令行ps以查看变量扩展到的内容,并将其设置为 sysconfig 文件中的某些内容以检查它是否在设置时有效。


至于在 shell 命令行上设置环境变量,AFAIU systemd 不会在 shell 调用的环境中运行服务systemctl,而是将它们从主 systemd 进程中分叉出来。这样,即使不小心,它们也不会继承 shell 环境的设置。环境变量可以产生广泛的影响,根据服务是在系统启动时启动还是从命令行重新启动,让您的服务表现不同会很烦人。

也就是说$MAINPID然而,它的特殊