【问题标题】:Creating a C++ daemon and keeping the environment创建 C++ 守护进程并保持环境
【发布时间】:2013-11-13 14:52:53
【问题描述】:

我正在尝试创建一个在 Red Hat 6.3 平台上运行的 c++ 守护程序,但我无法理解 libc daemon() 调用、daemon shell 命令、startprocstart-stop-daemon 之间的区别以及关于谷歌建议的其他六种创建守护进程的方法。

我看到了需要两个forks 的建议,但调用daemon 只需要一个。为什么需要第二个分叉?

如果我写init.d脚本调用bashdaemon,c代码还需要调用daemon吗?

我实现了我的应用程序来调用 c daemon() 函数,因为这似乎是最简单的解决方案,但我遇到了我的环境变量似乎被丢弃的问题。如何防止这种情况发生?

我还需要以特定用户而不是 root 身份运行守护程序。

创建一个保留其环境变量、以特定用户身份运行并在系统引导时启动的 C++ 守护程序的最简单方法是什么?

【问题讨论】:

    标签: c++ linux bash daemon


    【解决方案1】:

    为什么需要第二个分叉?

    Answered in What is the reason for performing a double fork when creating a daemon?

    bash 守护进程 shell 命令

    我的 bash 4.2 没有名为 daemon 的内置命令。你确定你的来自 bash 吗?什么版本,什么发行版?

    环境变量似乎被丢弃了。

    我在文档中看不到这方面的迹象。你确定是因为daemon吗?您是否检查过它们在通话之前是否存在,以及在通话后是否丢失?

    以特定用户身份运行守护进程

    了解setresuid 和相关功能。

    创建一个保留其环境变量、以特定用户身份运行并在系统引导时启动的 C++ 守护程序的最简单方法是什么?

    视情况而定。如果您想保持代码简单,请忘记所有这些并让 init 脚本通过例如执行此操作。 start-stop-daemon。如果你想在你的应用中处理这个问题,daemon 结合retresuid 应该是一个很好的方法,尽管不是唯一的方法。

    【讨论】:

    • 守护进程在 /etc/init.d/functions 中。我确定我的环境变量是在调用 daemon() 之前设置的,而不是之后设置的。
    • This post 澄清 /etc/init.d.functions 依赖于发行版。这是我关于你的分布的问题。我无法重现daemon 丢失环境;在我的测试应用程序中它工作正常。
    • 我目前在 Red Hat 6.3 上运行,因此很快将在另一台运行 CentOS 版本的服务器上进行设置。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2017-03-13
    • 2013-07-31
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多