进一步阅读

进一步阅读

根据runsv手册页:

如果目录 service/log 存在,runsv 将创建一个管道,将 service/run 和 service/finish 的标准输出重定向到该管道,切换到目录 service/log 并启动 ./run 脚本。日志服务的标准输入被重定向为从管道读取。

显然,runsv仅将服务的标准输出(而不是标准错误输出)重定向到 svlogd 标准输入。我的问题是:为什么?当然,我想记录我的设备的标准错误输出;为什么我必须额外注意添加exec 2>&1到每个单元文件的开头?

干杯!

答案1

事实上,你不知道。

runsv这种行为来自svscan在最初的 Bernstein daemontools 中,它也做了同样的事情。几乎其他人都复制了它。布鲁斯·冈特的svscan来自 daemontools-encore,Laurent Bercot 的s6-svscan来自 s6 和韦恩·马歇尔的perpd来自 perp 的所有人都这样做。

甚至亚当·桑普森 (Adam Sampson) 也svscan来自弗里特err尽管在代码中调用文件描述符,但仅连接标准输出。 ☺

注意到exec 2>&1fdmove -c 2 1已成为常态,并观察一些编程语言明确定义了标准日志最终成为文件描述符 2 的流(例如std::clog在 C++ 中),我做了service-manager在 nosh 工具集中连接两个标准输出当管道服务在一起时,管道的标准错误。

进一步阅读

相关内容