【问题标题】:General Daemon/Server Design - Best Practices (C/C++, Linux)通用守护程序/服务器设计 - 最佳实践(C/C++、Linux)
【发布时间】:2011-10-31 00:56:23
【问题描述】:

这些问题很笼统,因为它们在不同的情况下不断向我提出。我希望有一些基本原则/标准做法。

典型要求:

  1. 一个充当“服务器”的程序,在 linux 中运行 背景(并且几乎不间断运行。可能每天或每周重新启动)
  2. 通过一些套接字协议处理客户端连接
  3. 有启动配置文件
  4. 输出到一个或多个日志文件

我的问题:

  1. 我应该把程序写成“守护进程”吗?选择守护进程与非守护进程路由时应考虑哪些事项?
  2. 日志文件和配置文件应该在 linux 文件夹层次结构中的哪个位置?我应该从某个用户的主目录或某个用户​​的主目录中的子文件夹中运行它吗?或者我应该创建一个新文件夹,即 /my_server_abc/,然后从那里运行它,同时将日志文件写入该目录?

谢谢

【问题讨论】:

  • 下一次,这应该是两个单独发布的问题。
  • 我认为基本的best practices guide 会为您提供信息。

标签: c++ c linux daemon


【解决方案1】:
  1. 我应该把程序写成“守护进程”吗?

没有。

不要试图让自己守护进程。使用操作系统提供的工具使您的应用程序通过启动脚本在后台运行,例如 Debian/Ubuntu 中的start-stop-daemon。 Systemd 和 upstart 也可以在他们的启动脚本中为您处理这个问题,就像现在大多数初始化系统一样。

编写守护程序有一些您可能没有预料到的陷阱,而且大多数现代初始化脚本不希望您将自己的进程发送到后台 - 无论如何这会使他们的工作复杂化。例如,这允许生成可靠的.pid 文件来跟踪应用程序的进程 ID。如果您自己守护进程,则您的 init 系统必须依靠您的应用程序以某种方式正确传达您的进程 ID,因为您生成了 init 系统无法跟踪的新 PID。这让他们和你的事情都变得复杂。

【讨论】:

    【解决方案2】:

    我知道您在问这个问题时正在考虑 c/c++,但我认为它比这更笼统,并且设计时使用的逻辑与用于实现的语言无关。

    有一个 python 增强提案 (PEP 3143) 用于描述标准守护进程库,现已成为该语言的一部分。如果您查看this 有关正确守护程序行为的部分,它描述了守护程序应如何操作。还需要考虑“服务”和守护程序之间的差异。

    我认为这应该很好地回答您关于守护进程及其行为的一般问题。查看W. Richard Stevens' Home Page,您可以在 Prentice Hall 找到有关“Unix 网络编程”的信息,其中包含在 *nix 环境中编写守护进程和最佳实践时特定于 c/c++ 的更多信息。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        你应该写一个真正的守护进程(fork of to background an release tty)。这使得在系统启动时轻松运行软件是最佳实践。

        对于日志记录,您应该将日志保存在默认位置:/var/log。您甚至可能想使用syslog 进行日志记录,因为它是 linux 下的默认设置,您无需关心日志文件处理。

        【讨论】:

          猜你喜欢
          • 2011-12-16
          • 2010-11-18
          • 2020-08-10
          • 2010-09-24
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多