首页 > 解决方案 > 如何存储守护进程?

问题描述

想象一下 Docker。您可以以分离模式(守护程序)启动容器,它将在后台运行。当第一个容器在后台运行时,您可以创建一个以分离模式启动的新容器,它也将在后台运行。你可以看到正在运行的容器docker ps。此命令输出有关正在运行的容器等的表。

我正在编写一个与 Docker 具有相同概念的程序(不是关于容器,而是关于守护进程)。假设程序是abc,并且要创建一个新的守护程序,start我必须执行命令:

$ abc start

我们可以使用相同的命令再次创建一个新进程:

$ abc start

这一次,我想列出所有的守护进程(很好地格式化为表格)。

这是所需的输出:

$ abc start
abc: Program is starting...
$ abc start
abc: Program is starting...
$ abc list

+---------------------+
| Name      | ID      |
|===========|=========|
| Daemon #1 | 33454   |
+---------------------+
| Daemon #2 | 42344   |
+---------------------+

(表格的格式不重要)

我的问题是,如何将守护进程存储在某种容器中(而不是在 docker 容器的上下文中。例如,一个数组)?我想到的一件事是我可以将有关守护进程的信息存储在一个文件中,当用户想要列出守护进程时,程序可以从该文件中读取并显示它。但是,我不确定这种方法。我也不能使用数组,因为它不会从执行到执行保留其值。

(顺便说一句,用户不应该执行该ps命令。我想包含有关进程的额外信息,例如我的程序会给每个守护进程一个唯一的 ID。)

标签: cbashunixprocessdaemon

解决方案


如何存储守护进程

天上的星星一样多的方法。假设我们区分两种通用方式:

去中心化

每个过程都是独立的和独立的。句柄存储在某个已知的静态绝对位置。

系统服务通常将 pid 或有关守护进程的其他数据存储在/var/run. 用户服务使用/tmp或将其保存~/.somewhere~/.cache/somewhere/.

例如,screen多路复用器。在我的系统screen上保持套接字以在/var/run/screens/S-username/here. 当您运行screen -list它时,它使用位于恒定绝对位置的套接字/var/run/screen/S-username/there与其他屏幕会话进行通信并列出可用的屏幕会话。与 类似tmux

集中

让一个守护进程一直运行,负责收集和保存所有信息。

例如提到的码头工人。守护dockerd进程一直作为系统守护进程在系统上运行,客户端docker something只通过 tcp 或文件套接字将一些 HTTP 数据发送到主 docker 守护进程,然后主守护进程完成所有工作,将状态传输给客户端,所以它是向用户展示。与使用 DBus 进行通信的 NetworkManager 类似。


推荐阅读