我在处理项目中与 snmp 相关的问题时遇到了一个问题。
如果输入以下命令并使用各种选项来执行 snmpd,则 snmpd 将毫无问题地执行。
$ sudo /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -p /run/snmpd.pid
但是为了用systemctl命令执行snmpd,创建了下面的服务文件并尝试操作,但是失败了。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
随着时间的推移查找执行失败的原因,最终我得出结论,应该给-f选项来用systemctl命令执行snmpd。
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
我打开手册页查看了这个 -f 选项的功能。
在手册页中,对-f选项的功能进行了解释。
-f Do not fork() from the calling shell.
我所知道的 fork 的含义是进程自我复制的行为。
所以?
我仍然不明白使用 systemctl 运行 snmpd 和直接运行 snmpd 之间的区别。
我知道 systemctl 的 ExecStart 声明了一个驱动命令(脚本)。
向 ExecStart 声明可执行文件和直接运行它有什么区别?
有人帮助我吗?
答案1
最明显的区别是,一旦在 systemd 中启用该服务,它将与主机上的其他服务一起自动启动(和停止),例如在重新启动时。还可以在单元文件中定义其他行为 - 在启动服务之前您已经有一个条目来检查配置文件,并确保网络接口已启动,但其他常见的有:
- 如果服务崩溃则重新启动服务
- 对守护进程可以读取或写入的目录应用掩码
- 捕获 STDOUT 和/或 STDERR,将其重定向到(例如)系统日志
- 服务停止时应用一些清理操作
每个守护进程都有自己的一组命令行选项。它们有不同的机制来改变运行时的行为(重新加载)。 init 系统,无论是 SysV init、systemd、upstart、runit、openrc 还是其他系统,都提供一致的用户界面来启动、停止、查询和重新加载服务。