无法从 systemd 启动 Net-SNMP 守护程序(但可以从命令行启动)

无法从 systemd 启动 Net-SNMP 守护程序(但可以从命令行启动)

当我从 systemd 启动 Net-SNMP 时,没有错误消息,但守护进程没有运行:

% sudo systemctl start snmpd
%

当我从命令行启动它时,它会运行:

% sudo /usr/sbin/snmpd

并回答 SNMP 查询。

如果我添加调试标志(-LSdd),我会看到 systemd 启动的守护进程在之后立即被终止:

Apr  7 15:37:50 localhost snmpd[1298]: NET-SNMP version 5.7.2
Apr  7 15:37:50 localhost snmpd[1298]: Received TERM or STOP signal...  shutting down...

该服务文件是 Arch Linux 包的默认文件:

[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/sbin/snmpd 
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

如果我在服务文件中添加 RemainAfterExit=yes,snmpd 可以工作,但机器无法再正常启动(例如,没有 DHCP 客户端)

系统是最新的 Arch Linux,软件包的版本是:

Name           : net-snmp
Version        : 5.7.2-3

有一个旧的 Arch Linux 错误报告显然是针对这个错误的:https://bugs.archlinux.org/task/32258?string=snmp&project=1&type%5B0%5D=&sev%5B0%5D=&pri%5B0%5D=&due%5B0%5D=&reported%5B0%5D=&cat%5B0%5D=&status%5B0%5D=open&percent%5B0%5D=&opened=&dev=&closed=&duedatefrom=&duedateto=&changedfrom=&changedto=&openedfrom=&openedto=&closedfrom=&closedto=

答案1

问题出在启动过程中 snmpd 的 fork。

我的服务文件(用于 Exherbo)强制 snmpd 不使用fork()-f)并使用 运行服务Type=simple

Type=forking是 snmpd 默认行为的好方法,但它并不完整。

强烈建议PIDFile在使用时指定Type=forking,因为 systemd 并不总是能够知道在第一个进程退出后要监视哪个进程。

只需添加以下内容:

Type=forking
PIDFile=/var/run/snmpd.pid
ExecStart=/usr/sbin/snmpd -p /var/run/snmpd.pid

此更改还将修复ExecReload

相关内容