*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 项。