Unix 如何在不影响子进程的情况下监视子进程的输出和退出状态?

Unix 如何在不影响子进程的情况下监视子进程的输出和退出状态?,unix,process,signals,stdout,exit,Unix,Process,Signals,Stdout,Exit,我想让我的程序监视它已经启动的一些进程。这些是我所知道的最重要的要求: 记录子进程的退出状态(除非它们在我的程序退出后退出) 记录stderr和stdout输出。理想情况下,在它被写入后的几秒钟内,但这不是一个硬性要求:它可能足以在用户请求时读取它 有时,子进程将比我的程序更有效。其他时候,他们不会。重要的是,我的程序不应使子进程以可能给用户带来不便的方式退出--例如,发送到我的程序的Unix信号不应作为副作用杀死子进程。如果父级退出,子级应继续运行而不受影响 理想情况下,家长会跟踪孩子的分叉,

我想让我的程序监视它已经启动的一些进程。这些是我所知道的最重要的要求:

  • 记录子进程的退出状态(除非它们在我的程序退出后退出)

  • 记录stderr和stdout输出。理想情况下,在它被写入后的几秒钟内,但这不是一个硬性要求:它可能足以在用户请求时读取它

  • 有时,子进程将比我的程序更有效。其他时候,他们不会。重要的是,我的程序不应使子进程以可能给用户带来不便的方式退出--例如,发送到我的程序的Unix信号不应作为副作用杀死子进程。如果父级退出,子级应继续运行而不受影响

  • 理想情况下,家长会跟踪孩子的分叉,这样他们就可以被监控,也许还可以发出信号。不过,这不是一个硬性要求

  • 该方案需要在Linux和OS X上运行

  • 我的解决方案是执行daemonize进程所需的所有标准操作,第二个fork除外。在此之前,我将输出重定向到一个临时日志文件,然后使用inotify(在Linux上)或kqueues(在OSX上)监视日志文件

    据我所知,省略第二个fork对我的稳定性要求(3)的唯一损失是如果子进程获得了一个控制tty


    对于这些需求,这个解决方案是好的吗?我没有考虑到的子进程可能会发生哪些不好的事情?

    您计划运行哪些进程?这些过程需要终端输入吗?过程是否需要获取信号?如果流程需要交互,那么在监控标准输出和标准错误方面还有大量工作要做;您可能需要一个伪tty。您需要在单独的进程组中运行这些进程,这样您的程序就可以在不太影响子进程的情况下退出—但是伪tty监视将阻碍这一点。父母不能轻易地追踪孙子孙女。Linux有
    /proc
    ,但Mac OS X没有。非交互式进程。程序的信号行为大多未知。进程组不确定子进程是否受父进程退出的影响(但会话会)。