我为 snmpd 创建了一个动态可加载对象 .so 代理。该代理负责响应 oid 空间中的某些查询。该代理将安全信息写入 /etc/snmpd/custom_sec.conf 下。一切正常,但有一个奇怪的问题。
大约 50% 的系统启动时一切正常。我可以正常更改 custom_sec.conf。但另外 50% 的启动时,snmpd 或我的 .so 或 systemd 进入奇怪的状态,文件写入被拒绝。我无法写入文件。我甚至无法从我的 .so 写入简单的调试文件。
如果我执行 systemctl restart snmpd,无论启动条件如何,一切都会正常工作。
如果我对 snmpd.service 进行以下更改,则一切都正常:
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
# After=network.target ### CHANGED THIS TO FOLLOWING:
After=multi-user.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Environment="MIBSDIR=/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/s\
nmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp"
Environment="MIBS="
Type=simple
ExecStartPre=/bin/mkdir -p /var/run/agentx
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=1s
[Install]
# WantedBy=multi-user.target ### CHANGED THIS TO FOLLOWING:
WantedBy=graphical.target
似乎我不是唯一一个面临此类问题的人,例如:Systemd 服务无法写入文件,但仅限于冷启动时
有人能告诉我为什么我所做的唯一更改是推迟 snmpd 的启动,而我总是可以写入文件吗?
编辑 2022-03-24 6:44
遗憾的是我需要 10 点声誉才能发布图片,但这里是 systemd 启动图:
http://m.asuka.fi/uploads/startup_order_nonworking.svg
http://m.asuka.fi/uploads/startup_order_working.svg
令我困惑的是,在 startup_order_working.svg 中 snmpd 根本看不见……
编辑 2022-03-24 11:16
有一段时间,我把注意力集中在目标上。我认为我需要在 systemd-user-sessions.service 之后运行 snmpd.service 。但我又回到了 After=multi-user.target / WantedBy=graphical.target 解决方案。这是唯一有效的方法。这是 systemd、snmpd 还是两者的 bug?
答案1
我找到了问题所在。最后发现这很平凡。
我的 .so 也与 mosquitto 交互,但代理大多数时候在 snmpd/.so 之后启动。我的代码没有检查 mosquitto_connect() 是否真的成功。因此实际上没有任何入站 MQTT 消息被发送。这些消息会指示 .so 更改 /etc/snmp/ 下的安全文件。但什么都没有发送,也没有到达任何日志记录/printf 行。
我修改了 snmpd.service 如下:
[Unit]
After=network.target mosquitto.service
现在每次都能正常工作。如果 .so 无法连接到 MQTT 代理,我可能应该让 snmpd 退出。但现在它可以正常工作了。
答案2
它可能是ld.so.cache
由生成的文件ldconfig.service
。
查看sudo systemctl edit ldconfig.service --full
哪个刚刚运行ldconfig -X
以重建ld.so.cache文件。
以下是一些您可以检查的事项。
创建一个包含上次启动时间轴的 svg 文件(已加载服务的时间轴)。网络浏览器应该能够读取该文件(比控制台更好)。
systemd-analyze plot > boot.svg
安慰
systemd-analyze blame
正在sudo ldconfig -v
展示您的.so
?
需要多长时间才能完成?