我很好奇使用 systemctl 命令运行守护进程和直接运行它之间的区别

我很好奇使用 systemctl 命令运行守护进程和直接运行它之间的区别

我在处理项目中与 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 还是其他系统,都提供一致的用户界面来启动、停止、查询和重新加载服务。

相关内容