我有一个正在运行的守护进程(不是我创建的),我需要能够读取它的日志。不幸的是,它没有日志文件。有没有办法将守护进程的输出导入到文件中,并让它不断更新,以便我可以在其上运行 tail -f?
答案1
下的文件/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 /proc/<PID>/fdinfo/ | xargs -n 1 cat
。
当然,它将打开文件描述符0
(stdin)、1
(stdout) 和2
(stderr),并且它可能255
打开文件描述符(用于 tty)。如果 fdinfo 指示pos
非零值,则意味着文件描述符几乎肯定正在使用中(因为它给出了文件/流/什么的指针的位置)。
如果它确实没有记录到磁盘上的任何文件中,那么这个答案关于重定向正在运行的进程的输出的说明可能对您有用。值得注意的是,可以gdb
从文件执行命令,而不是以交互方式执行,这样您就可以最大限度地减少守护进程的中断时间。
另外值得注意的是,你用来运行的进程gdb
将受到ptrace
系统调用,因此您需要确保您的进程以 root 身份运行,或者在其他上下文中运行,以便可以附加到守护进程。
或者,当然,如果您不介意让守护进程暂时停机,您可以在 docker 容器内运行它并以此方式捕获输出。