如何为现有的守护进程创build日志?

我有一个deamon运行(我没有创build),我需要能够读取其日志。 不幸的是,它没有日志文件。 有没有办法将守护进程的输出pipe道化为一个文件,并不断更新,以便我可以运行尾部-f?

/proc/<PID>/fd/<FD>下的文件是符号链接到它们相应的文件对象。 因此,如果PID 45920程序正在读取/home/hypnotoad/all_glory_to_the_hypnotoad中的文件,并且该文件映射到文件描述符3 ,则运行ls -l /proc/45920/fd/3将产生:

 lrwx------. 1 root root 64 Mar 15 18:33 /proc/45920/fd/3 -> /home/hypnotoad/all_glory_to_the_hypnotoad 

因此,如果您有守护进程的PID,可以使用ls -l /proc/<PID>/fd/来查看它打开了哪些文件描述符(以及这些描述符映射到哪些文件),并且可以find一点更多关于使用find /proc/<PID>/fdinfo/ | xargs -n 1 cat描述符 find /proc/<PID>/fdinfo/ | xargs -n 1 cat

当然,它将打开文件描述符0 (标准input), 1 (标准输出)和2 (标准错误),并且可能有文件描述符255打开(对于一个tty)。 如果fdinfo指示一个非0的pos值,那么这意味着文件描述符几乎肯定会被使用(因为它将指针的位置赋予了文件/stream/你所拥有的)。

如果它确实没有logging到磁盘上的任何文件,那么这个redirect正在运行的进程的输出的答案可能对您有用。 值得注意的是可以从文件中获得gdb执行命令,而不是交互式地执行命令,这样就可以最小化守护进程的中断时间。

还值得一提的是,你用来运行gdb的过程将受到围绕ptrace系统调用的通常限制,所​​以你需要确保你的进程是以root身份运行的,或者是在其他的环境中运行的,可以附加到守护进程。

另外,当然,如果你不介意守护进程暂时停顿一下,你可以在Docker容器中运行它,并以这种方式捕获输出。