lost命令简介
lsof(list open files) 是一个列出当前系统打开文件的工具。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。可用于查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。
安装lost
当前最新版是4.91
wget https://www.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_4.91.tar.gz
解压lsof_4.91.tar.gz
tar xzvf lsof_4.91.tar.gz
#lsof tarball 的内容包括另一个带有源代码的 tarball,需要依次解压
cd lsof_4.91
tar -xf lsof_4.91_src.tar
编译
cd lsof_4.91_src
./Configure -n linux
make
添加软连接 需要注意lsof文件的编译路径
如果路径不对可能会影响体验,添加软连接的好处是,为了在任意路劲下执行lsof命令。
ln -s /data/lsof_4.91/lsof_4.91_src/lsof /usr/bin/
查看软连接
[root@ncayu8847 bin]# pwd
/usr/bin
[root@ncayu8847 bin]# ll |grep lsof
lrwxrwxrwx 1 root root 34 9月 22 21:04 lsof -> /data/lsof_4.91/lsof_4.91_src/lsof
[root@ncayu8847 bin]#
命令格式和命令参数
lsof [参数][文件]
命令参数:
-a 列出打开文件存在的进程
-c <进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d <文件号> 列出占用该文件号的进程
+d <目录> 列出目录下被打开的文件
+D <目录> 递归列出目录下被打开的文件
-n <目录> 列出使用NFS的文件
-i <条件> 列出符合条件的进程。(4、6、tcp/udp、:port、 @ip )
-p <进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
实用命令
lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof -c sendmail //查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -D /tmp //显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列
lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -u tony //查看用户tony的进程的文件使用情况
lsof -u ^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i:80 //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数
命令演示
查看当前是否有进程打开/var/logmessages文件
[root@ncayu8847 data]# lsof |grep /var/log/messages
rsyslogd 22347 root 6w REG 253,1 47210 393481 /var/log/messages
rsyslogd 22347 22349 in:imjour root 6w REG 253,1 47210 393481 /var/log/messages
rsyslogd 22347 22364 rs:main root 6w REG 253,1 47210 393481 /var/log/messages
使用-p查看指定进程ID已打开的内容
[root@ncayu8847 data]# lsof -p 30345
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
AliYunDun 30345 root cwd DIR 253,1 4096 1572895 /usr/local/aegis/aegis_client/aegis_11_05
AliYunDun 30345 root rtd DIR 253,1 4096 2 /
AliYunDun 30345 root txt REG 253,1 2785712 1572897 /usr/local/aegis/aegis_client/aegis_11_05/AliYunDun
AliYunDun 30345 root mem REG 253,1 109976 1052397 /usr/lib64/libresolv-2.17.so
AliYunDun 30345 root mem REG 253,1 31344 1052385 /usr/lib64/libnss_dns-2.17.so
AliYunDun 30345 root mem REG 253,1 61560 1052387 /usr/lib64/libnss_files-2.17.so
AliYunDun 30345 root mem REG 253,1 213976 1572939 /usr/local/aegis/aegis_client/aegis_11_05/libModuleHex.so
AliYunDun 30345 root mem REG 253,1 2447096 1572941 /usr/local/aegis/aegis_client/aegis_11_05/libModuleMetadata.so
找出监听端口
[root@ncayu8847 data]# lsof -i -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 5470 mysql 32u IPv6 251507889 0t0 TCP *:opsession-prxy (LISTEN)
redis-ser 7328 root 6u IPv4 237188646 0t0 TCP ncayu8847:6380 (LISTEN)
node_expo 11426 root 3u IPv6 254469325 0t0 TCP *:jetdirect (LISTEN)
prometheu 12369 root 8u IPv6 254470058 0t0 TCP *:websm (LISTEN)
mysqld 13518 mysql 48u IPv6 239228359 0t0 TCP *:33060 (LISTEN)
mysqld 13518 mysql 51u IPv6 239228361 0t0 TCP *:8847 (LISTEN)
grafana-s 13687 root 10u IPv6 254474968 0t0 TCP *:hbci (LISTEN)
java 18824 root 58u IPv4 22169420 0t0 TCP *:webcache (LISTEN)
java 18824 root 69u IPv4 22168446 0t0 TCP localhost:mxi (LISTEN)
sshd 22228 root 3u IPv4 237928164 0t0 TCP *:ssh (LISTEN)
docker-pr 22741 root 4u IPv4 237199082 0t0 TCP *:6379 (LISTEN)
docker-pr 22756 root 4u IPv6 237199084 0t0 TCP *:6379 (LISTEN)
nginx 31303 nginx 7u IPv4 238263035 0t0 TCP *:mysql (LISTEN)
nginx 31449 nginx 7u IPv4 238263035 0t0 TCP *:mysql (LISTEN)
使用-i:port来显示与指定端口相关的网络信息
[root@ncayu8847 data]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 31303 nginx 7u IPv4 238263035 0t0 TCP *:mysql (LISTEN)
nginx 31449 nginx 7u IPv4 238263035 0t0 TCP *:mysql (LISTEN)
使用-i 6仅获取IPv6流量
[root@ncayu8847 data]# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 5470 mysql 32u IPv6 251507889 0t0 TCP *:opsession-prxy (LISTEN)
node_expo 11426 root 3u IPv6 254469325 0t0 TCP *:jetdirect (LISTEN)
node_expo 11426 root 7u IPv6 254473140 0t0 TCP ncayu8847:jetdirect->120.78.85.73:48936 (ESTABLISHED)
prometheu 12369 root 8u IPv6 254470058 0t0 TCP *:websm (LISTEN)
mysqld 13518 mysql 48u IPv6 239228359 0t0 TCP *:33060 (LISTEN)
mysqld 13518 mysql 51u IPv6 239228361 0t0 TCP *:8847 (LISTEN)
grafana-s 13687 root 10u IPv6 254474968 0t0 TCP *:hbci (LISTEN)
docker-pr 22756 root 4u IPv6 237199084 0t0 TCP *:6379 (LISTEN)
ntpd 28588 ntp 17u IPv6 73606712 0t0 UDP *:ntp
写在最后
lsof的命令可以使用的范围很广泛,我们只要找到适合自己的点就行。Linux命令中,最实用的还有grep,awk,sed 三剑客
,我要好好整理一下,希望国庆假期给自己充充电。