求你了,下次不要问别人日志写在哪!(2)

求你了,下次不要问别人日志写在哪!(2)_第1张图片
from @unsplash

上次我们说到,有一些程序的日志可能写入到 pts 文件中,详情请回顾:

https://www.jianshu.com/p/ea3ff3c8302e

root@ubuntu:/proc/5651/fd$ sudo ls -Gg
total 0
lrwx------ 1 64 Aug 28 20:09 0 -> /dev/null
lrwx------ 1 64 Aug 28 20:09 1 -> /dev/pts/1

如果可以通过读取这个 pts 来收集日志就好了,但如果不能怎么办呢?

我们知道, stdout 的文件描述符(fd)一定是 1 。那么,想办法把别的文件的 fd 赋值为这个 1 ,然后这个程序的日志输出,就会切换到另外一个文件中了,而且是我们主动选择的一个文件,而不是 pts 这样不太熟悉的文件。而且不会中断原有的进程。

怎么做呢,我们需要两个工具:

gdb 是 GNU debugger,一个调试工具。底层是 c 的各种程序,他都可以调试,包括 nodejs,和 ruby。
另外,我们还需要一个 unix 操作系统提供的 c 方法,叫做 dup2,他是一个封装好的系统调用,大家可以在 man page 找到(man 2 dup2),作用就是复制一个文件描述符,并且附上一个新的值,比如我们想要的 1。

接下来,执行:

sudo gdb -p PID # PID is the process id you're working on

这样,我们就想用 gdb 工具,进入了一个进程的调试模式。

然后在 gdb 中,执行下面这个命令:

p dup2(open("path/to/your/file", 1), 1)

这其实是在调用上面提到的 dup2,把 path/to/your/file 这个文件打开,并把他的文件描述符赋值为 1。

至于语法上为什么需要先写一个 p,这个我还不太清楚。

但此时,我们依然出现了对那个进程打断点的状态,我们需要执行 quit 退出 gdb,那个进程才能继续执行。

到这里,日志文件已经变为我们期待的文件了。但是,gdb 的作用其实不止于此,有机会的话我们可以继续讨论。

你可能感兴趣的:(求你了,下次不要问别人日志写在哪!(2))