Q: 一个已经在运行的 service,并没有在文件中保存自己的log,如何得到它的输出?
A: 借助 gdb,可以将该进程的 fd 任意修改。
-
gdb -> attach $pid -> call open("'/dev/pts/20'", 66, 0666)
// 20 是dst,新的位置 - 去
/proc/$pid/fd/
下,可以看到一个新的 fd 指向 20,比如是 6 -
call dup2(6, 1); call dup2(6, 2)
// dup to : 把 fd6 复制到 fd1, 2 (标准输出 & error) call close(6)
deatch; quit;
这样做以后,你就会在 pts/20 中看到这个进程的输出了。
(再严谨一点的话,可以在 第 2 步后,把旧的 dup 出来,然后在第 4 步的时候 close 掉。)