如何查看正在运行的写入文件 (shred) 的进程的详细输出

如何查看正在运行的写入文件 (shred) 的进程的详细输出

我正在运行 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 个步骤的方法:

  1. 找出工具的 PID

    例如:

    # pgrep ^shred$
    699
    
  2. 注意此 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 的情况一样此评论) 或任何其他,取决于命令、此命令的版本或调用时的选项。

  3. 查询内核,使用/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)。

这种方法不需要工具的任何配合:它不必在终端中运行,以详细模式运行,在任何地方输出任何文本,在任何地方记录任何内容,支持处理特殊信号(如dddoes)来转储信息,也不需要ptrace()-ed:内核通过 提供当前信息/proc

相关内容