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。container
macos_service
windows_service
systemd
container
答案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
或其他目录中的文件读取变量,但概念是相同的。它只是将变量(即配置)和单元本身分离到不同的文件中。