【问题标题】:Boost.Log and creating daemons; `fork` disallowed?Boost.Log 和创建守护进程;不允许使用“叉子”?
【发布时间】:2016-01-07 01:37:38
【问题描述】:

我需要在我的应用程序中添加一个命令行选项,说明它将作为 deamon 运行。

但是,我也在使用 boost logging 库来保存这个应用程序的日志,我发现 boost logging 不支持分叉。

这似乎阻止了我分叉,因此我无法创建 守护进程

  • 是否可以绕过这个问题,或者;
  • 我可以在不分叉的情况下创建守护进程吗?

【问题讨论】:

  • 为什么不提升日​​志记录不支持fork?没有办法解决这个问题吗?毕竟除了init 之外的所有进程都是fork 的结果。
  • @skyking boost.org/doc/libs/1_57_0/libs/log/doc/html/log/rationale/… 虽然我猜如果你在分叉后初始化日志记录,你仍然可以守护进程。
  • 当只允许子进程继续生存和记录时,分叉仍然是一个问题吗?一些描述的问题与同时记录的多个进程有关——在守护进程的双​​叉场景中,这不会发生。如果这仍然是一个问题,是否有办法将 boost 日志的初始化推迟到第二次分叉之后?
  • @skyking 如果您已经开始从父进程登录,这将是一个问题,但是如果您开始登录子进程(从不在父进程中),您是安全的。有关信息,请参阅我的答案。
  • @FilipRoséen-refp 这就是为什么我问是否可以将 boost 日志的初始化推迟到第二次分叉之后。

标签: c++ linux boost fork daemon


【解决方案1】:

守护程序中的forks 对守护程序按this question 的答案中所述的预期工作起着重要作用。

如果唯一的问题是由于多个进程记录了分叉,则应该不是问题,因为您不必在完成分叉之前登录。除了这些分叉的父进程无论如何都会终止。

如果终止父级有问题,您可以将 boost 日志的初始化推迟到第二个 fork 之后。

如果 boost 日志总是在 main 之前初始化,则解决方案可能需要确保forks 甚至在此之前发生,即设法使代码在 boost 日志初始化之前运行 - 这将需要一个实现具体解决办法。

对于最坏情况下独立于实现(除了 posix 支持)的解决方案是使用execl 来确保实际的守护进程不会分叉,您实际上使用了一个执行守护进程的程序不要使用 boost 日志记录和一个适当的守护程序程序。如果您不使用日志记录功能(在 fork 之后),对于 fork 来说这不是一个大问题,您甚至可以使用一个可执行文件来执行此操作,并将其行为与命令行开关不同。在伪代码中:

int main() {
    parse_command_line();

    if( no_daemonize_flag() )
        run_daemon()
    else {
        daemonize();
        execl("/path/to/daemon", "/path/to/daemon", "--no-daemonize", ...other flags..., NULL);
    }
}

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 2018-11-03
    • 2010-12-16
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2014-10-10
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多