我试图检查一个不承认 curl
的进程,该进程是在较早的登录中启动的。我可以看到它(PID 17193)仍在运行:
$ ps aux | grep curl
17193 jack 7700 3692 S 1:00 20:48 curl https://examples.com/file.ext -O
18124 jack 3576 876 S 0:00 21:18 grep curl
我试图查看下载的进度,但它的输出已被删除:
$ ls -l /proc/17193/fd
total 0
lrwx------ 1 jack users 64 May 19 20:50 0 -> /dev/pts/1 (deleted)
lrwx------ 1 jack users 64 May 19 20:50 1 -> /dev/pts/1 (deleted)
lrwx------ 1 jack users 64 May 19 20:50 2 -> /dev/pts/1 (deleted)
lrwx------ 1 jack users 64 May 19 20:50 3 -> socket:[2343571]
l-wx------ 1 jack users 64 May 19 20:50 4 -> /dir/file.ext
我应该怎么做才能看到输出?谢谢!
看东西很简单:
真正的重定向很复杂。您可以将调试器附加到正在运行的进程,关闭 fd 并打开它以获取新文件。但是对于活跃的网络,我想这必须快速完成,以避免连接中断。
正如 JdeBP 所说,如果不附加调试器,这是不可能的。幸运的是,有一些程序可以完全自动化地做到这一点。Reptyr就是这样一个程序。只需运行
reptyr 17193
,它将重新连接到您的终端。如果没有调试器,这是不可能的。
您的程序的标准输出和标准错误将发送到主端已关闭的伪终端的从端。除了调试进程和拦截系统调用等极端措施外,没有办法访问其输出。
这些是终端的语义。
如果您挂断终端会话(即挂断真实终端的串行设备,退出内核虚拟终端设备上的登录会话,挂断 SSH/用户空间虚拟终端/TELNET/rlogin/ 使用的伪终端的主端) X11 终端仿真器)仍然引用该终端的进程的打开文件描述符旨在不再导致 I/O 或连接到任何东西。这是 Unix 对抗特洛伊木马程序的方法,这些程序过去常常挂在终端设备上打开文件描述符,并使用它们向终端的下一个用户提供虚假的登录提示。
这早已产生了诸如
tmux
GNU Screen、mosh 之类的程序,或者console-terminal-emulator
它们保持打开伪终端的主端,模拟终端的显示和输入,并允许可断开和可重新连接的客户端/实现器进程(即“客户端”和 GNU Screen的一部分tmux
;mosh 客户端;或console-fb-realizer
,console-termio-realizer
或其他类似的)将其渲染到真实设备上。因此
tmux
,如果您想要可重新连接性,请使用 GNU Screen、mosh、nosh 工具集的用户空间虚拟终端或其他类似系统。进一步阅读
revoke
. FreeBSD 系统调用手册。2016-01-25。vhangup
. Linux 程序员手册. Debian 手册页。2016-03-15。