systemd 文件未获取环境值

systemd 文件未获取环境值

filebeat 的 Systemd 文件无法获取环境变量并抛出如下错误

ExecStart=/usr/share/filebeat/bin/filebeat -environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS (code=exited, status=2)

下面是我的 filebeat 服务的 systemd

 [Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Documentation=https://www.elastic.co/products/beats/filebeat
Wants=network-online.target
After=network-online.target

[Service]

Environment="BEAT_LOG_OPTS="
Environment="BEAT_CONFIG_OPTS=-c /etc/filebeat/filebeat.yml"
Environment="BEAT_PATH_OPTS=-path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat"
ExecStart=/usr/share/filebeat/bin/filebeat -environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS
Restart=always

[Install]
WantedBy=multi-user.target

答案1

正如所提到的filebeat 文档-environment不用于指定环境变量,但要指定 Filebeat 正在运行的环境。此外, 可BEAT_PATH_OPTS用于 filebeat 进程,但不可用于 systemd,您尝试使用$BEAT_LOG_OPTS。 systemd 服务文件不是 shell 脚本。请参阅系统服务了解详情。

-环境

为了记录目的,指定 Filebeat 运行的环境。此设置用于在未配置日志输出时选择默认日志输出。支持的值包括: 、、systemd和。如果指定了或 ,Filebeat 将默认记录到 stdout 和 stderr。containermacos_servicewindows_servicesystemdcontainer

答案2

这些值不是 shell 环境变量,但可以从“drop-in”目录中的服务单元补充文件中读取。这本质上是一个带有后缀的目录.d,因此如果您的服务单元是/etc/systemd/system/filebeat.service,那么您可以拥有一个类似的文件/etc/systemd/system/filebeat.service.d/filebeat.service.conf(文件名可以是任何名称,只需保留.conf扩展名即可)。

那么你的filebeat.service.conf看起来会像这样:

[Service]
Environment="BEAT_LOG_OPTS="
Environment="BEAT_CONFIG_OPTS=-c /etc/filebeat/filebeat.yml"
Environment="BEAT_PATH_OPTS=-path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat"

简而言之,您可以将某些内容从单元文件中移出,这样它就可以保持不变,而文件.conf可以根据需要进行更改。

就是这样。systemd 单元不应该读取环境变量。这些变量仅限于您的 shell。

当然,您可以根据需要设置各种脚本来调整这些.conf文件,只需确保systemctl daemon-reload先调用即可。在此之前,systemd 不会重新读取这些值。某些服务使用其他怪癖,从下面/etc/sysconfig或其他目录中的文件读取变量,但概念是相同的。它只是将变量(即配置)和单元本身分离到不同的文件中。

相关内容