根据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>&1
和fdmove -c 2 1
已成为常态,并观察一些编程语言明确定义了标准日志最终成为文件描述符 2 的流(例如std::clog
在 C++ 中),我做了service-manager
在 nosh 工具集中连接两个标准输出和当管道服务在一起时,管道的标准错误。
进一步阅读
- 乔纳森·德博因·波拉德 (2014)。并排查看运行脚本和服务单元。。经常给出的答案。
- 乔纳森·德博因·波拉德 (2015)。 ”记录”。守护进程工具家族。经常给出的答案。
- https://unix.stackexchange.com/a/294206/5132