从终端会话中恢复正在运行的脚本


35

因此,我正在使用GNU屏幕来管理多个正在运行的脚本/程序。多路复用和可分离性很有帮助。

我从磁盘上删除了一个脚本,现在在查找备份时遇到了一些麻烦。但是,其中一个终端会话正在执行脚本,然后删除了该文件,该脚本继续正常运行。

有没有办法劫持当前正在运行脚本的终端会话以恢复该文件的内容?


Answers:


61

使用以下命令查找脚本的pid ps

ps -ef|grep script.sh
Fdo  8983  8463  0 12:28 pts/2    00:00:00 /bin/bash ./script.sh

检查/proc/$PID/fd/; 脚本文件应该有一个损坏的链接,但cat 应该可以工作(脚本运行时!):

cat /proc/8983/fd/255 
#!/bin/bash
# script contents!

祝好运!


@mrc我认为这项工作是因为文件的内容已加载到内存中
c4f4t0r

很棒的建议!这也警告@fdo需要设置一个不错的备份例程,因为下次他可能不太幸运。
Criggie '17

12
@ c4f4t0r与是否将其加载到内存无关。在有打开的句柄的情况下,Linux明确不会删除文件(inode)-该文件保留在磁盘上,占用空间。rm和其他工具取消链接文件,从文件到实际数据(由inode引用)删除链接,但是只要存在引用(硬链接或打开句柄),就不会删除inode。
鲍勃(Bob)

只是好奇...您怎么知道要检查FD 255?还是只是一个例子?
gardenhead

2
@gardenhead这是一个例子。
user253751'17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.