Node Exporter被 SIGPIPE
杀死¶
备注
这个问题我主要是记录,尚未真正遇到,不过,我遇到过类似生产环境组件因为 SIGPIPE
退出的问题,原理和情况相似。
这个 SIGPIPE
导致 Node Exporter 退出的问题会发生在早期版本,不过现在 Node Exporter 内置了 SIGPIPE
处理,所以已经不再出现因为 PIPE
管道异常导致退出的问题。这里仅作为记录参考
Node Exproter在 Systemd进程管理器 环境下运行,有时候你可能会遇到异常退出,检查 systemctl status node_exporter
可能会看到类似:
● node_exporter.service - Prometheus exporter for machine metrics, written in Go with pluggable metric collectors.
Loaded: loaded (/usr/lib/systemd/system/node_exporter.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2017-05-27 04:54:39 EDT; 1 day 20h ago
Docs: https://prometheus.io
Main PID: 27203 (code=killed, signal=PIPE)
这里被 信号 PIPE
杀死的原因:
当使用已经失效的读取器写入管道时,写入器将收到 SIGPIPE
信号。默认情况下,这会终止进程。如果忽略这个信号,写入将返回错误 EPIPE
。无论 reader
是怎么死亡的,这种情况都会发生。
这里 node_exporter
服务配置是:
[Unit]
Description=node_exporter
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=500
StartLimitBurst=5
[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/node_exporter \
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
[Install]
WantedBy=multi-user.target
默认配置是 Restart=on-failure
,早期版本没有处理 SIGPIPE
信号,所以会导致收到 PIPE
信号时候退出,但是因为没有作为Fail处理,所以也不会自动启动。
对于不能处理 SIGPIPE
信号的软件退出问题,可以修改 Systemd进程管理器 配置,修改为:
Restart=always
或者加上:
RestartForceExitStatus=SIGPIPE