【问题标题】:Ok to write to stdout on Unix process without terminal?可以在没有终端的情况下在 Unix 进程上写入标准输出吗?
【发布时间】:2012-10-11 09:21:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您不能在启动时手动将守护程序的标准输出重定向到 /dev/null 吗?
  • 我不对系统中启动守护进程的部分负责。而且我也不知道那部分到底是如何工作的。这个问题是要弄清楚我是否必须这样做,或者我是否可以保持原样。
  • 嗯,你需要知道守护进程是如何启动的。如果不确定,那么你应该照顾它。
  • 您可以尝试stackoverflow.com/questions/6583158/… 来检查它的附加位置。

标签: c++ unix solaris stdout


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    更一般地说,所有进程都是从另一个程序启动的(除了 初始化进程);大多数时候,该程序是一个 shell(甚至 crontab 调用一个 shell 来启动它的工作),并且给出了命令 作为命令行。你可以在任何你喜欢的地方重定向输出 在命令行中; /dev/null 是您这类案例的热门选择。 大多数守护进程都是从rc 文件启动的;安装了一个 shell 脚本 在/etc/rc<i>n</i>.d 下。只需将您的输出重定向到那里。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2013-05-03
      • 2020-07-16
      相关资源
      最近更新 更多