关于这篇精彩的文章:
https://stackoverflow.com/questions/958249/whats-the-difference-between-nohup-and-a-daemon
我想问以下问题:
从我的终端启动应用程序后,该应用程序继续在后台或前台运行,我能与其交互的唯一方法就是从我的终端向它发送信号(假设 stdin 仍然存在)。
然而,在启动守护进程之后,我意识到可以使用额外的方式(除了信号)来控制它,比如使用下面的标志来查询它(arch-way):
# /etc/rc.d/daemon-name {start|stop|restart|status|...}
有人能否向我解释一下该功能是否内置于通用“守护进程框架”中并作为特殊功能适用于每个守护进程,还是仅仅是设计为守护进程运行的进程必须在内部处理的一项规定?
更进一步说,我们究竟如何使用守护进程的名称从终端“控制”守护进程(即 sambad stop),而应用程序却总是必须使用其名称来引用(即 kill -9 12345)?
先感谢您!
答案1
如果我理解正确,当您使用 sambad stop 时,它也由 PID 编号引用,该编号存储在 /var/run/ 目录中(或其他目录,具体取决于您的系统)。执行此操作时会创建该文件start
。
该功能未内置于该守护进程中。如果您编辑 /etc/rc.d/daemon-name,您会看到它是一个简单的 bash 脚本,它使用指定的参数运行进程(在 Linux 上可以在该脚本中定义参数,在 Unix 上可以在 /etc/rc.conf 中定义参数)。您可以编写自己的守护进程名称启动和停止脚本。
基本上:
- 开始从终端运行进程(进程自动知道它应该在后台运行,有时会有特殊参数,如-d),
- 停止它正在做,
kill -9
cat /var/run/daemon.pid
- 重新开始它正在做,
kill -HUP
cat /var/run/daemon.pid
- 地位它正在做类似的事情:。
ps
cat /var/run/daemon.pid
除了使用 unix 套接字发送信号之外,还有其他不同的通信方法。例如,您可以通过发送消息来控制进程dbus
。请参阅:man dbus-send
以下命令将列出所有 unix 套接字:
netstat -lp --unix
您可以通过 dbus 进行过滤:
netstat -lp --unix | grep -w dbus
通过执行dbus-monitor
您可以看到不同的进程如何相互通信。
以下是向其他服务发送消息的一些示例:
dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames
阅读一些有用的文章:
答案2
大多数功能不是内置于守护进程中,而是内置于启动脚本。其中/etc/init.d/sambad
将有代码来跟踪启动时的 PID,并在需要停止时发出信号。初始化脚本通常更特定于发行版而不是所讨论的守护进程,因为系统启动和服务管理是 Linux 发行版用来区分自己的主要领域之一。
无需终止并重新启动守护进程即可重新加载配置文件的功能是这些操作中唯一需要在守护进程内部编写大量代码的功能。