lsof - 文件的年龄

lsof - 文件的年龄

*nix 命令lsof为您提供打开文件的列表。有谁知道一种方法还可以列出特定文件打开的时间?通过使用lsof或任何其他命令。我使用的是 CentOS 5.3,不幸的是我无法安装额外的存储库,因此我必须使用默认的 CentOS 存储库。

谢谢

答案1

如果有pid的话可以直接查看/proc/$pid/fd。它似乎创建文件描述符的位置。

如果您使用简单的命令查看它们的创建日期ls -lh,也许您将能够知道特定文件已打开多长时间。

答案2

lsof一个不太准确的猜测可能是使用和 use提供的 pidps来查明打开该文件的程序何时运行。当然,这仅适用于程序启动时打开的文件,不适用于稍后打开的文件。

答案3

我试图自己得到这个。我想出的是这样的:

#!/bin/sh

BASE=`basename "${0}" ".sh" `
TMP="/tmp/tmp.$$.${BASE}"

#COMMAND     PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
#firefox    2713      username   88u  IPv4 445702      0t0  TCP 192.168.0.10:42564->142.251.41.4:443 (ESTABLISHED)
#firefox    2713      username   94u  IPv4 445943      0t0  TCP 192.168.0.10:50416->108.138.106.67:443 (ESTABLISHED)
#firefox    2713      username  119u  IPv4  44675      0t0  TCP 192.168.0.10:49430->104.16.249.249:443 (ESTABLISHED)
#firefox    2713      username  144u  IPv4 275162      0t0  TCP 192.168.0.10:34266->34.218.164.174:443 (ESTABLISHED)

sudo lsof -Pni | grep '(ESTABLISHED)' >"${TMP}.connections"

cat "${TMP}.connections" |
awk '{
    ### fd/1 gives the timestamp of the last usage of stdin
    #printf("/proc/%s/fd/1|%s|%s|%s\n", $2, $4, $9, $10 ) ;

    ### mountinfo gives the timestamp when the [main] process was started.
    printf("/proc/%s/mountinfo|%s|%s|%s\n", $2, $4, $9, $10 ) ;
}' |
while [ true ]
do
    read line
    if [ -z "${line}" ] ; then exit 0 ; fi

    procpath=`echo "${line}" | awk -F \| '{ print $1 }' `
          fd=`echo "${line}" | awk -F \| '{ print $2 }' `
        conn=`echo "${line}" | awk -F \| '{ print $3 }' `
      status=`echo "${line}" | awk -F \| '{ print $4 }' `

    age=`stat "${procpath}" | grep '^Change' | awk '{ p=index( $3, "." ) ; time=substr( $3, 1, p-1 ) ; print $2, time ; }' `

    dat=`awk -v FD="${fd}" '{ if( $4 == FD ){ print $0 ; exit } ; }' "${TMP}.connections" `

    echo "${age}  ${dat}"
done

其输出如下所示:

2022-09-18 16:16:33  firefox    2713      username   88u  IPv4 776358      0t0  TCP 192.168.0.10:39970->151.101.129.69:443 (ESTABLISHED)
2022-09-18 16:16:33  firefox    2713      username  119u  IPv4  44675      0t0  TCP 192.168.0.10:49430->104.16.249.249:443 (ESTABLISHED)
2022-09-18 16:16:33  firefox    2713      username  144u  IPv4 275162      0t0  TCP 192.168.0.10:34266->34.218.164.174:443 (ESTABLISHED)
2022-09-18 16:16:33  firefox    2713      username  161u  IPv4 547918      0t0  TCP 192.168.0.10:34960->198.252.206.25:443 (ESTABLISHED)
2022-09-18 16:16:33  firefox    2713      username  170u  IPv4 543499      0t0  TCP 192.168.0.10:33700->198.252.206.25:443 (ESTABLISHED)
2022-09-18 16:16:33  firefox    2713      username  187u  IPv4 549543      0t0  TCP 192.168.0.10:47142->198.252.206.25:443 (ESTABLISHED)

问题是所有 Firefox 相关项目的日期都是相同的,因为没有报告不同的 PID,即使ps 确实报告各种子任务的多个 PID

不知道这对人们来说是否会带来好处。

另外,FD值, 例如 ”119u“ 在以下位置找不到/proc/2713 树,既不作为文件名,也不作为该树中任何文件的内容。我绝对不是专家,但作为用户,我会想象这之间应该存在一些具体的联系“119u”和进程树下列出的 fd 项

相关内容