我在 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
在zsh
Linux 上,您可以执行以下操作:
ls -lrtL /proc/*/fd/*(-l0)
检查在任何进程 fd 上打开但被删除的文件的 mtime(墨迹值为l
)0
。
对于路径包含以下内容的人mongo
:
ls -lrtL /proc/*/fd/*(-l0e['[[ $REPLY:P = *mongo* ]]'])
使用相对较新版本的 GNU ls
,您可以添加--time=birth
来报告(并排序)出生时间而不是上次修改时间。另请参阅--full-time
更精确的时间。