我正在运行 shred 命令来安全地擦除一些存储。
我想看看它的进度,但是已经丢失了运行该命令的 ssh 终端。
有什么方法可以从新的 ssh 终端查看 shred 命令的详细输出?
我尝试挂接并查看 /proc/pid/fd/0 1 2 等的输出,但它只显示来自 /dev/urandom 的随机字符。我尝试使用 strace,但相同的文件描述符可用,结果相同。Shred 显示 0、1、2、3 和 4 fd,但它们都显示随机输出。
MTIA,用听诊器耐心等待驱动器......
答案1
在 Linux 上(因为 OP 提到 /proc/pid/fd/0 这是 Linux 的东西),对于任何执行顺序操作的工具,可以使用以下 3 个步骤的方法:
找出工具的 PID
例如:
# pgrep ^shred$ 699
注意此 PID 中正在读取或写入的文件描述符
例如使用
ls -l /proc/<pid>/fd/
或stat -c %N /proc/<pid>/fd/<FD>
或lsof ...
...例子:
# ls -l /proc/699/fd/ total 0 lrwx------ 1 root root 64 May 24 11:40 0 -> /dev/pts/6 lrwx------ 1 root root 64 May 24 11:40 1 -> /dev/pts/6 lrwx------ 1 root root 64 May 24 11:40 2 -> /dev/pts/6 l-wx------ 1 root root 64 May 24 11:40 3 -> /dev/loop7
这里感兴趣的 FD 是 3。它可能是 FD 4(就像 OP 的情况一样此评论) 或任何其他,取决于命令、此命令的版本或调用时的选项。
查询内核,使用
/proc/<pid>/fdinfo/<fd>
关于其他信息:/proc/[pid]/fdinfo/
(自 Linux 2.6.22 起)[...] 该目录中的文件只有进程的所有者才能读取。
(或通过根或者至少是具有足够能力的流程。)
每个文件的内容都可以读取获取相应文件描述符的信息。 [...]
字段如下:
pos
这是一个小数显示文件偏移量的数字。
[...]例如:
# cat /proc/699/fdinfo/3 pos: 286785536 flags: 0140001 mnt_id: 830 ino: 39
或者:
# awk '/^pos:/ { print $2 }' /proc/699/fdinfo/3 286785536
因此,在这个例子中,
shred
目前正在写入位置 286785536 (~273MiB)。
这种方法不需要工具的任何配合:它不必在终端中运行,以详细模式运行,在任何地方输出任何文本,在任何地方记录任何内容,支持处理特殊信号(如dd
does)来转储信息,也不需要ptrace()
-ed:内核通过 提供当前信息/proc
。