c - 如何存储守护进程?
问题描述
想象一下 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。)
解决方案
如何存储守护进程
天上的星星一样多的方法。假设我们区分两种通用方式:
去中心化
每个过程都是独立的和独立的。句柄存储在某个已知的静态绝对位置。
系统服务通常将 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 类似。
推荐阅读
- python - 你如何使用线程在 Python 中通过对等网络进行通信?
- haskell - lisp 反引号和拼接的 Haskell 模拟
- c# - 有没有一种方法可以将许多 int 变量相互比较?
- python - 使用 pivot_table 创建的边距存在 Period 数据类型的问题
- c# - Selenium C# SendKeys NullreferenceException 未被用户代码处理
- python - 如何在 AWS IoT 上创建自定义 OTA 更新?
- c# - C# 在控制台应用程序中构建 Visual Studio 项目
- machine-learning - 如何修复 HPCC ECL 学习树错误:对象“类型”没有名为“t_Work-Item”的成员?
- python - 使用 list(range(x)) 而不是 range(x) 打印列表
- javascript - 导入模块时找不到ts文件中的函数