这些问题非常普遍,因为它们在不同的情况下不断涌现。我希望有一些基本原则/标准做法。
典型要求:
我的问题:
由于
答案 0 :(得分:2)
- 我应该将程序编写为“守护程序”吗?
醇>
没有
不要试图让自己守护。使用操作系统配置的工具使您的应用程序在启动脚本的后台运行,例如Debian / Ubuntu中的start-stop-daemon
。 Systemd和upstart也可以在他们的启动脚本中为你处理这个问题,如今大多数初始化系统也是如此。
编写一个守护进程有一些你可能不会想到的陷阱,并且大多数现代的init脚本都不希望你将自己的进程发送到后台 - 这无论如何都会使他们的工作复杂化。这允许生成可靠的.pid
文件以跟踪应用程序的进程ID。如果你自己守护,你的init系统必须依靠你的应用程序以某种方式正确地传递你的进程id,因为你生成新的PID,init系统无法跟踪。这对他们来说都很复杂。
答案 1 :(得分:1)
答案 2 :(得分:0)
你应该编写一个真正的守护进程(后台的fork和发布tty)。这使得在系统启动时轻松运行软件是最佳实践。
对于日志记录,您应将日志保留在默认位置:/var/log
。您甚至可能希望使用syslog
进行日志记录,因为它是linux下的默认值,您无需关心日志文件处理。
答案 3 :(得分:0)
我知道你在问这个问题时正在考虑c / c ++,但我认为它比这更普遍,设计时使用的逻辑独立于实现所用的语言。
有一个python增强提议(PEP 3143),用于描述现在已成为该语言一部分的标准守护进程库。如果您查看有关正确守护程序行为的this部分,它将描述守护程序应如何操作。还需要考虑“服务”和守护进程之间的差异。
我认为应该很好地回答关于守护进程及其行为的一般问题。查看W. Richard Stevens' Home Page,您可以找到有关'Unix网络编程'的信息,Prentice Hall在* nix环境和最佳实践中编写守护进程时,有更多关于c / c ++的信息。