我有一个 C 程序,我想将其作为守护进程运行。我正在 ubuntu 14.04LTS 中工作。哪种方法是正确的?有人可以帮忙吗?
答案1
现在,Ubuntu 给出了答案。
正确的方法是在 Ubuntu 14 附带的守护进程管理器下。其他人在这里所说的关于明确设计一个程序作为守护进程,并调用daemon()
库函数的说法完全是错误的。讽刺的是,Ubuntu 已经推出了三个 LTS 版本事先的到版本 14 LTS——事实上是从 2006 年的 Ubuntu 6.10 开始。从那时起,它就有了这样或那样的守护进程管理器。
对于拥有适当服务管理的人来说,正确的答案是:不要打电话daemon()
给你不要采取特殊步骤“成为守护进程”。对于一些人来说,自 20 世纪 90 年代初以来,这一直是正确的答案。即使是 2006 年,这个聚会也显得有些迟了。 ☺ 即便如此,对于 Ubuntu 来说,这绝对是过去十年的正确答案。
你所做的很简单。您设置了一个新贵“作业”文件,告诉新贵何时以及如何调用您的程序。新贵调用它已经被恶魔化了,没有控制终端,并且具有可预测且不变的初始过程状态。你的程序没有什么特别的并简单地运行,以正常方式将日志和错误消息写入标准错误。您可以在作业文件中安排 upstart 如何处理写入标准错误的内容。
这新贵食谱详细描述了所有这些,包括控制启动事件和日志处理的各个节。这里和 AskUbuntu 上有很多关于这个主题的内容。
请做好准备,如果您稍后升级到 Ubuntu 16 LTS,世界将会发生巨大的变化。但即便如此在代码中不执行任何特殊操作,只需在守护进程管理器下运行仍将是正确答案。
进一步阅读
- 詹姆斯·亨特和克林特·拜鲁姆 (2014)。 “安慰”。 新贵食谱。
- https://unix.stackexchange.com/a/200281/5132
- 在里面Ubuntu 14.04 手册页。典范。
- 乔纳森·德博因·波拉德 (2001)。 设计 Unix 守护程序时要避免的错误。常见答案。
- https://superuser.com/a/723333/38062
- https://askubuntu.com/a/613814/43344
答案2
如果您的问题是从终端运行程序,这里有一些方法(您的程序不得要求任何用户输入):
使用
nohup
:nohup program > program.log 2>program.err &
。然后您可以退出终端。使用
atd
服务:echo "program > program.log 2>program.err" | at now
或echo "program > program.log 2>program.err" | batch
。作为启动脚本的服务。
如果您的程序要求用户输入,那么将无法在终端之外运行它,最好是使用screen
或tux
会话,然后将其与终端分离。