Node Exporter被 SIGPIPE 杀死
备注
这个问题我主要是记录,尚未真正遇到,不过,我遇到过类似生产环境组件因为 SIGPIPE 退出的问题,原理和情况相似。
这个 SIGPIPE 导致 Node Exporter 退出的问题会发生在早期版本,不过现在 Node Exporter 内置了 SIGPIPE 处理,所以已经不再出现因为 PIPE 管道异常导致退出的问题。这里仅作为记录参考
Node Exproter在 Systemd进程管理器 环境下运行,有时候你可能会遇到异常退出,检查 systemctl status node_exporter 可能会看到类似:
服务进程被
PIPE 信号杀死的案例● 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 服务配置是:
node_exporter.service 配置[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