可以在没有终端的 Unix 进程上写入标准输出

Ok to write to stdout on Unix process without terminal?

本文关键字:进程 标准输出 Unix 终端      更新时间:2023-10-16

我想确保以下内容不会影响我的进程:

Solaris 程序大量写入 stdout(通过 C++ wcout 流)。输出用于跟踪,因此在测试和分析期间,程序员/测试人员可以轻松观察发生的情况。但是该程序实际上是一个服务器进程,因此在生产版本中,它将作为没有附加控制台的恶魔运行,并将所有跟踪输出写入文件。

我假设标准输出被重定向到没有控制台的程序的 nul,在这种情况下,我想一切都很好。但是,我想确保 stdout 输出没有缓冲在某个地方,以便在足够的运行时后我们可能会遇到内存或磁盘空间问题。

注意:我们无法将跟踪输出重定向到文件,因为这会变得太大。相反,我们自己的文件跟踪机制确保创建新文件并删除旧文件,以始终保持一定数量的跟踪,而不是更多。

我想这取决于守护进程的启动方式。创建守护进程时,必须以某种方式处理流(例如,它们需要与当前进程分离,至少当手动启动它的 shell 退出时,必须终止守护进程)。

这取决于守护程序的启动方式。 如果它是作为 cron 作业开始的,输出将被捕获并邮寄给拥有 crontab 的人条目,除非您在命令行中重定向输出。 (但是作为 cron 作业启动的程序并不是真正的守护进程。

更一般地说,所有进程都是从另一个程序启动的(除了初始化过程);大多数时候,该程序是一个外壳(甚至 crontab调用 shell 来启动其作业),并给出命令作为命令行。 您可以将输出重定向到您喜欢的任何地方在命令行中; 对于像您这样的案例,/dev/null是一个受欢迎的选择。大多数守护程序都是从rc文件启动的;已安装的外壳脚本在/etc/rcn.d. 只需将您的输出重定向到那里即可。

或者更好的是,重写代码以使用某种形式的旋转日志,而不是标准输出。