【问题标题】:How to store daemon processes?如何存储守护进程?
【发布时间】:2021-08-29 01:51:05
【问题描述】:

想象一下 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。)

【问题讨论】:

  • 可以使用redis。但是文件也应该可以正常工作,具体取决于您计划使用这些数据的复杂性和方式

标签: c bash unix process daemon


【解决方案1】:

如何存储守护进程

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

去中心化

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

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

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

集中式

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

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

【讨论】:

  • 感谢您的回答。它真的帮助我解决了我的问题!
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2023-03-02
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多