如何存储守护进程?

How to store daemon processes?

想象一下 Docker。您可以以分离模式(守护进程)启动容器,它将在后台 运行 。虽然第一个容器在后台 运行ning,但您可以在分离模式下创建一个新容器,它也会在后台 运行。您可以看到带有 docker ps 的 运行ning 容器。此命令输出 table 关于 运行ning 容器等

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

$ abc start

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

$ abc start

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

这是所需的输出:

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

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

(table 的格式不重要)

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

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

how can I store the daemon processes

途径多如天上繁星。假设我们区分两种通用方式:

去中心化

每个进程都是独立的。句柄存储在一些已知的静态绝对位置。

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

中的某处

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

集中式

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

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