fuser、lsof、端口占用
一、常见的查看端口占用命令
1、lsof方式1
1 | lsof -i:80 |
方式2
1 2 3 4 | sudo lsof -nP -iTCP -sTCP:LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 1485 root 4u IPv4 12337 0t0 TCP *:873 (LISTEN) clash 32427 root 31u IPv4 1475475597 0t0 TCP 127.0.0.1:9090 (LISTEN) |
使用的选项如下:
-
-n
不要将端口号转换为端口名称。 -
-p
不解析主机名,显示数字地址。
-iTCP -sTCP:LISTEN
-仅显示TCP状态为LISTEN的网络文件
1 | sudo lsof -nP -iTCP:3306 -sTCP:LISTEN |
2、nc方式
1 | nc -l 80 |
3、fuser方式
1 | fuser -v -n tcp 80 |
4、netstat方式
1 | netstat -anptl | grep 80 |
5、ss方式
1 2 3 4 5 | ss -lp src :80 ss -lnp | grep 80 ss sport = :22 |
二、fuser
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息
fuser只把PID输出到标准输出,其他的都输出到标准错误输出。
# fuser -m -v /dev/sda1
1 2 3 4 5 6 7 8 9 10 | 用户 进程号 权限 命令 /dev/sda1: root kernel mount /boot 运行下面命令杀掉占用此设备的进程 fuser -m -v -k /dev/sdb1 或者fuser -m -v -k -i /dev/sdb1(每杀掉一下进程会让你确认) 再umount |
# fuser -v -n tcp 80 查看80端口占用
1 2 3 4 5 | 用户 进程号 权限 命令 80 /tcp : root 2020 F.... nginx nginx 2021 F.... nginx nginx 2022 F.... nginx nginx 2023 F.... nginx |
# fuser -n tcp 80
1 | 80 /tcp : 2020 2021 2022 2023 |
# ps -ef | grep nginx
1 2 3 4 5 | root 2020 1 0 22:40 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 2021 2020 0 22:40 ? 00:00:00 nginx: worker process nginx 2022 2020 0 22:40 ? 00:00:00 nginx: worker process nginx 2023 2020 0 22:40 ? 00:00:00 nginx: worker process root 2055 1930 0 22:42 pts /0 00:00:00 grep --color=auto nginx |
# netstat -anptl | grep 80
1 2 3 | tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2020 /nginx : master tcp 0 0 192.168.40.132:22 192.168.40.1:58019 ESTABLISHED 1924 /sshd : root@pts tcp6 0 0 :::80 :::* LISTEN 2020 /nginx : master |
三、lsof (list open files)
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
lsof打开的文件可以是:
1 2 3 4 5 6 7 8 9 | 1. 普通文件 2. 目录 3. 网络文件系统的文件 4. 字符或设备文件 5. (函数)共享库 6. 管道,命名管道 7. 符号链接 8. 网络文件(例如:NFS file 、网络socket,unix域名socket) 9. 还有其它类型的文件,等等 |
lsof的选项
1 2 3 4 5 6 7 8 9 10 11 12 | -a:列出打开文件存在的进程; -c<进程名>:列出指定进程所打开的文件; -g:列出GID号进程详情; -d<文件号>:列出占用该文件号的进程; +d<目录>:列出目录下被打开的文件; +D<目录>:递归列出目录下被打开的文件; -n<目录>:列出使用NFS的文件; -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号>:列出指定进程号所打开的文件; -u:列出UID号进程详情; -h:显示帮助信息; -v:显示版本信息。 |
补充
lsof +D <directory>
- 功能:递归地列出指定目录下所有打开的文件。
- 用法:
lsof +D /path/to/directory
- 说明:该命令会列出所有在指定目录及其子目录中被打开的文件。需要注意的是,
+D
选项会在大目录上消耗较多资源,因为它会递归查找子目录中的所有文件。
1 2 3 4 5 6 | [root@node1 ~] # lsof +D /backup COMMAND PID USER FD TYPE DEVICE SIZE / OFF NODE NAME minio_nod 3958 root 255r REG 253 , 2 426 14811138 / backup / minio / minio_node1.run mysql_mas 3962 root 255r REG 253 , 2 575 68026424 / backup / mysql / mysql_master.run es_node1. 3963 root 255r REG 253 , 2 567 56229911 / backup / elasticsearch / es_node1.run nacos - sta 4013 root 255r REG 253 , 2 281 68157443 / backup / nacos / nacos - startup.sh |
1、查看端口占用
1 2 3 4 | lsof -i:80 # nc -l 80 (nc方式) Ncat: bind to :::80: Address already in use. QUITTING. |
ss方式查看80端口占用
1 | ss -lp src :80 |
查看接入网络的应用
lsof -P -i -n
1 2 3 4 5 6 7 8 | lsof -P -i -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME loki 1306 loki 12u IPv4 35501 0t0 TCP 127.0.0.1:46070->127.0.0.1:9096 (ESTABLISHED) loki 1306 loki 13u IPv6 51482 0t0 TCP 127.0.0.1:9096->127.0.0.1:46070 (ESTABLISHED) loki 1306 loki 15u IPv4 15147 0t0 TCP 127.0.0.1:46082->127.0.0.1:9096 (ESTABLISHED) rpc.mount 1322 root 11u IPv6 28947 0t0 TCP *:50881 (LISTEN) rpc.mount 1322 root 12u IPv4 40864 0t0 UDP *:37096 rpc.mount 1322 root 13u IPv4 46718 0t0 TCP *:59327 (LISTEN) |
2、查看系统当前打开的文件描述符数量
第一个数表示当前系统分配后已使用的文件描述符数,第二个数表示分配后未使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),第三个数等于最大值f。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | cat /proc/sys/fs/file-nr 1440 0 176997 查看docker.sock占用的文件描述符数量 lsof /var/run/docker.sock | wc -l 1025 列出pid sudo lsof -t /var/run/docker.sock 1 2187 列出指定进程所打开的文件 sudo lsof -c docker |
3、查看某个进程打开的文件描述符数量
1 2 | # lsof -p 2486 |wc -l (nginx master进程) 59 |
4、看下哪些进程占用的文件描述符比较多,排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # lsof -n | more COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 256 128 / systemd 1 root rtd DIR 253,0 256 128 / #lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr |head -10 2584 982 376 865 360 874 279 1429 116 988 111 989 110 858 92 1 88 875 79 1459 |
注lsof -n输出解读:
- COMMAND:进程的名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd(current work dirctory)、txt等
- TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
df方式查看inode剩余情况
1 2 3 4 5 6 7 8 9 10 | $ df -Thi 文件系统 类型 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/sda3 xfs 24M 407K 24M 2% / devtmpfs devtmpfs 2.0M 477 2.0M 1% /dev tmpfs tmpfs 2.0M 1 2.0M 1% /dev/shm tmpfs tmpfs 2.0M 924 2.0M 1% /run tmpfs tmpfs 2.0M 16 2.0M 1% /sys/fs/cgroup /dev/sda1 vfat 0 0 0 - /boot/efi 10.1.1.2:/mnt/data/nfs/ public nfs 1.4G 48M 1.3G 4% /mnt/nfs tmpfs tmpfs 2.0M 1 2.0M 1% /run/user/1000 |
ls方式查看文件inode号
1 2 3 | $ ls -i fm-package 100891313 fingerprint-celery.tar.gz 34343355 fingerprint-web |
列出某个用户打开的文件信息
1 | lsof - u username |
列出某个程序进程所打开的文件信息
1 | lsof - c pycharm |
列出某个用户的所有活跃的网络端口
1 2 3 4 5 6 7 8 9 10 11 | lsof -a -u sanpangdan -i COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME cloudd 614 sanpangdan 12u IPv4 0x4313ad2339699ef 0t0 TCP localhost:65351->localhost:7890 (ESTABLISHED) WiFiAgent 617 sanpangdan 3u IPv4 0x4313ad22e9ce8c7 0t0 UDP *:* identitys 622 sanpangdan 14u IPv4 0x4313ad23027ecc7 0t0 UDP *:* identitys 622 sanpangdan 22u IPv4 0x4313ad22fb848c7 0t0 UDP *:* identitys 622 sanpangdan 26u IPv6 0x4313acd6a9a7007 0t0 TCP jingzhiz-macbook-pro. local :1024->[fe80:16::d0ff:42ed:a634:e1e1]:1024 (ESTABLISHED) identitys 622 sanpangdan 33u IPv6 0x4313acd66dd3807 0t0 TCP jingzhiz-macbook-pro. local :solid-mux->[fe80:16::d0ff:42ed:a634:e1e1]:blackjack (ESTABLISHED) identitys 622 sanpangdan 34u IPv6 0x4313acd66dd3807 0t0 TCP jingzhiz-macbook-pro. local :solid-mux->[fe80:16::d0ff:42ed:a634:e1e1]:blackjack (ESTABLISHED) Dash 631 sanpangdan 75u IPv4 0x4313ad233a764ff 0t0 TCP localhost:49906 (LISTEN) Dash 631 sanpangdan 76u IPv6 0x4313acd69500807 0t0 TCP localhost:49906 (LISTEN) |
列出所有网络文件系统
1 | lsof -N |
5、已知进程pid,查进程用户
查看进程ID
1 2 3 4 5 6 7 8 9 | #netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 870/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2486/nginx: master tcp6 0 0 :::22 :::* LISTEN 870/sshd tcp6 0 0 :::33060 :::* LISTEN 982/mysqld tcp6 0 0 :::3306 :::* LISTEN 982/mysqld tcp6 0 0 :::80 :::* LISTEN 2486/nginx: master |
进入/proc目录查找相应进程ID目录并进入此目录
1 | # cd /proc/2486 |
在进程ID目录中查找exe连接,后面就是运行进程ID对应文件的绝对路径
1 2 | # ll | grep exe lrwxrwxrwx 1 root root 0 Sep 24 21:01 exe -> /usr/sbin/nginx |
通过软件应用名查进程,如查找 nginx的进程
1 2 3 4 | # pgrep -l nginx 3706 nginx 3707 nginx 3708 nginx |
可以按照进程名杀死进程
pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。
1 | pkill gaim |
根据进程查软件名 ps -p 进程id
1 2 3 | ps -p 2486 PID TTY TIME CMD 2486 ? 00:00:00 nginx |
查看进程号占用的端口
1 2 3 4 5 | netstat -tlnp | grep 46063 tcp6 0 0 :::9100 :::* LISTEN 46063/node_exporter ss -tlnp | grep 46063 LISTEN 0 4096 *:9100 *:* users:(( "node_exporter" ,pid=46063,fd=3)) |
根据软件名查找监听端口
1 2 3 4 5 | netstat -anplt | grep node_export tcp6 0 0 :::9100 :::* LISTEN 46063/node_exporter tcp6 0 0 10.1.1.131:9100 10.132.5.88:38020 ESTABLISHED 46063/node_exporter tcp6 0 0 10.1.1.131:9100 10.11.1.32:33042 ESTABLISHED 46063/node_exporter tcp6 0 0 10.1.1.131:9100 10.13.1.34:58212 ESTABLISHED 46063/node_exporter |
或者
1 2 | journalctl | grep -i node_export | grep "Listening on" May 12 17:12:43 pve8 node_exporter[46063]: ts=2022-05-12T09:12:43.953Z caller=node_exporter.go:199 level=info msg= "Listening on" address=:9100 |
6、用lsof恢复被删数据
误删除文件且进程还在
1 2 3 4 5 | #备份 cp /var/log/message /var/log/message_bac lsof |grep /var/log/message rsyslogd 1737 root 1w REG 8,2 5716123 652638 /var/log/messages |
进程在运行中,接下来我就把/var/log/messages这个文件删掉
1 | rm /var/log/messages |
删掉之后,我再来看看这个进程的变化
1 2 | lsof |grep /var/log/messages rsyslogd 1737 root 1w REG 8,2 5716123 652638 /var/log/messages (deleted) |
PID:1737 FD:1 那我们有直接进入/proc/1737/FD/1用ll查看一下
1 2 3 4 5 6 7 8 | # cd /proc/1737/fd/ # ll total 0 lrwx------ 1 root root 64 Dec 23 13:00 0 -> socket:[11442] l-wx------ 1 root root 64 Dec 23 13:00 1 -> /var/log/messages (deleted) l-wx------ 1 root root 64 Dec 23 13:00 2 -> /var/log/secure lr-x------ 1 root root 64 Dec 23 13:00 3 -> /proc/kmsg l-wx------ 1 root root 64 Dec 23 13:00 4 -> /var/log/maillog |
看到了1对应/var/log/messages (deleted),看看文件是不是我们要的文件:
1 2 3 4 5 6 | > head -5 1 Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started. Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 |
对比备份文件:
1 2 3 4 5 6 | head -5 /var/log/message_bac Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started. Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 |
对比发现数据是一样的,恢复
1 | cat 1 > /var/log/messages 依情况而定,有可能是2或者4 |
误删除文件且进程不存在(extundelete工具)
这种情况一般是没有守护进程或者后台进程对其持续输入,所以删除就删除了,lsof也看不到。就要借助于工具。这里我们采用的工具是extundelete第三方工具。恢复步骤如下:
1.停止对当前分区做任何操作,防止inode被覆盖。inode被覆盖基本就告别恢复了。比如停止所在分区的服务,卸载目录所在的设备,有必要的情况下都可以断网。
2.通过dd命令对当前分区进行备份,防止第三方软件恢复失败导致数据丢失。适合数据非常重要的情况,这里测试,就没有备份,如备份可以考虑如下方式:
https://mp.weixin.qq.com/s/2NA5kQ1ta6HJNo2HrSTajg 有待学习
1 2 3 | df -i /var/log/nginx/error.log Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/cl-root 23150592 44428 23106164 1% / |
7、列出所有的网络链接
1 2 3 4 5 6 7 8 9 10 11 12 | #lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 724 chrony 5u IPv4 22867 0t0 UDP localhost:323 chronyd 724 chrony 6u IPv6 22868 0t0 UDP localhost:323 sshd 931 root 3u IPv4 22431 0t0 TCP *:ssh (LISTEN) sshd 931 root 4u IPv6 22433 0t0 TCP *:ssh (LISTEN) master 1139 root 13u IPv4 24257 0t0 TCP localhost:smtp (LISTEN) master 1139 root 14u IPv6 24258 0t0 TCP localhost:smtp (LISTEN) gitlab-ex 1378 git 5u IPv4 25157 0t0 TCP localhost:9168 (LISTEN) gitlab-ex 1378 git 6u IPv6 25158 0t0 TCP localhost:9168 (LISTEN) gitlab-ex 1378 git 14u IPv6 26928 0t0 TCP localhost:9168->localhost:43738 (ESTABLISHED) gitlab-ex 1378 git 18u IPv6 27729 0t0 TCP localhost:9168->localhost:43744 (ESTABLISHED) |
根据文件描述范围列出文件信息
1 2 3 4 5 6 7 8 9 | #lsof -d 2-3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 2u CHR 1,3 0t0 1030 /dev/null systemd 1 root 3u a_inode 0,9 0 8023 [timerfd] systemd-j 489 root 2w CHR 1,3 0t0 1030 /dev/null systemd-j 489 root 3u unix 0xffff88016b566800 0t0 1420 /run/systemd/journal/std lvmetad 512 root 2u unix 0xffff88016b6ae800 0t0 16392 socket lvmetad 512 root 3u unix 0xffff8800bb30f800 0t0 11203 /run/lvm/lvmetad.socket systemd-u 517 root 2u unix 0xffff88003652b400 0t0 16316 socket |