UNIX lsof 命令所需的帮助

UNIX lsof 命令所需的帮助

我在 RHEL 8 上发现了一些 Ghost 文件(从操作系统中删除了文件,但未从 MongoDB 中删除)。我想检查 Ghost 文件何时创建。请帮助如何使用以下命令检查 Ghost 文件创建日期时间。

lsof | grep deleted | grep mongod | wc -l

答案1

首先,这是运行命令的另一种更好的方法:

lsof +L 1 -a -c mongod

+L 1将显示链接计数小于 1 的所有文件(已删除文件的链接计数为零),-c mongod将显示名称以“mongod”开头的进程,并-a显示两者的并集,即:打开的所有已删除文件流程他们的名字以“mongod”开头。

关于“创建时间”(在 Linux 中称为“出生时间”),仅 Linux 上的少数文件系统支持它。大多数文件系统根本不支持它。您可以通过运行stat <some file>并检查“出生”字段来检查您的文件系统是否支持出生时间。

例如:

$ stat /etc/motd |grep Birth
 Birth: -

您可以看到,在我的例子中,不支持出生时间。

但是,即使您的文件系统不支持 Bith 时间,您也可以获得文件的一些其他时间戳,这些时间戳可能对您有用。

首先,您应该从命令的输出中获取lsof进程的 pid 和已删除文件的文件描述符。

$ lsof +L 1 -a -c tail
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NLINK NODE NAME
tail    44305 root    3r   REG   8,10        6     0 4193 /tmp/testfile (deleted)

在这种情况下,pid 是44305,文件描述符(在 下FD)字段是3。您可以stat通过运行以下命令来运行已删除的文件:stat -L /proc/<pid>/fd/<fd number>

-L标志用于取消引用文件描述符的链接,即在文件描述符(仅是符号链接)链接到的文件而不是链接本身上运行 stat。就我而言:

$ stat -L /proc/44305/fd/3
  File: '/proc/44305/fd/3'
  Size: 6               Blocks: 8          IO Block: 4096   regular file
Device: 80ah/2058d      Inode: 4193        Links: 0
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-10-27 16:14:24.519483990 +0300
Modify: 2022-10-27 16:12:06.676463711 +0300
Change: 2022-10-27 16:15:55.425475599 +0300
 Birth: -
  • Access显示上次访问文件的时间,在本例中为 16:14:24。
  • Modify显示上次更改文件内容的时间。在本例中为 16:12:06。
  • Change通常显示最后一次 *元数据文件的内容已更改(例如:所有者、用户、权限),但如果文件已删除,则会显示文件被删除的时间。所以就我而言,该文件在 16:15:55 被删除。

答案2

zshLinux 上,您可以执行以下操作:

ls -lrtL /proc/*/fd/*(-l0)

检查在任何进程 fd 上打开但被删除的文件的 mtime(墨迹值为l0

对于路径包含以下内容的人mongo

ls -lrtL /proc/*/fd/*(-l0e['[[ $REPLY:P = *mongo* ]]'])

使用相对较新版本的 GNU ls,您可以添加--time=birth来报告(并排序)出生时间而不是上次修改时间。另请参阅--full-time更精确的时间。

相关内容