我试图检查一个不承认的 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
我应该做什么才能看到输出?谢谢!
答案1
看到很容易:
cat /proc/17193/fd/1 ; tail -n 0 -f /proc/17193/fd/1
真正的重定向是复杂的。您可以将调试器附加到正在运行的进程,关闭 fd 并打开它以获取新文件。但对于活跃的网络,我想这必须快速完成,以避免连接被破坏。
答案2
正如 JdeBP 所说,如果不附加调试器,这是不可能的。幸运的是,有一些程序可以完全自动化地做到这一点。雷普特尔就是这样一个程序。只需运行reptyr 17193
,它将重新连接到您的终端。
答案3
如果没有调试器,这是不可能的。
您的程序的标准输出和标准错误将发送到主端已关闭的伪终端的从属端。除了调试进程和拦截系统调用等极端措施之外,没有办法访问其输出。
这些是终端的语义。
如果挂断终端会话(即挂断真实终端的串行设备、退出内核虚拟终端设备上的登录会话、挂断 SSH/用户空间虚拟终端/TELNET/rlogin/ 使用的伪终端的主端) X11 终端模拟器)仍然引用该终端的进程的打开文件描述符是故意的不再引起 I/O 或连接到任何东西。这是对抗特洛伊木马程序的 Unix 方法,特洛伊木马程序通常会打开终端设备的文件描述符,并使用它们向终端的下一个用户提供虚假的登录提示。
这早已催生了诸如tmux
、GNU Screen、mosh 或console-terminal-emulator
它保持伪终端的主端打开,模拟终端的显示和输入,并允许可断开和可重新连接的客户端/实现器进程(即tmux
GNU Screen 的“客户端”部分;mosh 客户端;或console-fb-realizer
,console-termio-realizer
或其他类似的东西)将其渲染到真实设备上。
因此,tmux
如果您想要可重新连接性,请使用 、GNU Screen、mosh、nosh 工具集的用户空间虚拟终端或其他此类系统。
进一步阅读
- 普蒂。NetBSD 内核接口手册。 2013年11月13日。
revoke
。 FreeBSD 系统调用手册。 2016年1月25日。vhangup
。 Linux 程序员手册。 Debian 手册页。 2016年3月15日。- Daniel J. Bernstein 谈 Unix 中的 TTY。经常给出的答案。
- 乔纳森·德博因·波拉德。 用户空间虚拟终端。 小吃指南。软件。