gpt4 book ai didi

linux - 将 stdout 重新打开到 linux 守护程序的常规文件?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:12 24 4
gpt4 key购买 nike

我知道守护进程不应该写入 stdout(和 stderr),因为一旦从控制终端分离,它就不再可用。但是我能否将 stdout 重新打开到一个常规文件中,以便我所有的原始日志记录仍然有效?这对我来说非常有用。

fork 后我试过这样的东西,

freopen("/dev/null/", "r", stdin);
freopen("log", "w", stdout);
freopen("log", "w", stderr);

BOOST_LOG_TRIVIAL(info) << "daemonized!";

可以启动守护进程(准确的说是不会失败退出),并且可以创建日志文件。但是日志是空的(没有“守护进程!”)。这不是守护进程的正确方法吗?有人可以阐明一下吗?

最佳答案

有一个库函数,daemon(int nochdir, int noclose) ,可用于帮助代码适本地守护进程并另外重新打开连接到 /dev/null 的标准 I/O 流。使用它和系统日志工具(如 syslog)将是我将采用的方式,作为守护进程的“正确”方式。

打开标准 I/O 流并与 /dev/null 相关联的好处是可以避免因这些 I/O 遗留(例如,可能会阻塞过程或导致意外信号)。它还可以防止任何新的描述符在不知情的情况下获取它们并在不知不觉中从 say left over printf 语句中获取输出。

就将标准 I/O 流与常规文件相关联而言,在线 daemonize program 中的以下警告手册页似乎有助于识别:

Be careful where you redirect the output! The file system containing the open file cannot be unmounted as long as the file is open. For best results, make sure that this output file is on the same file system as the daemon's working directory.

关于linux - 将 stdout 重新打开到 linux 守护程序的常规文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42709750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com