可以在没有终端的Unix进程上写入stdout吗?

时间:2012-10-11 09:21:47

标签: c++ unix solaris stdout

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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