fuser、lsof、端口占用
一、常见的查看端口占用命令
1、lsof方式1
lsof -i:80
方式2
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的网络文件
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
2、nc方式
nc -l 80
3、fuser方式
fuser -v -n tcp 80
4、netstat方式
netstat -anptl | grep 80
5、ss方式
ss -lp src :80 ss -lnp | grep 80 ss sport = :22
二、fuser
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息
fuser只把PID输出到标准输出,其他的都输出到标准错误输出。
# fuser -m -v /dev/sda1
用户 进程号 权限 命令 /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端口占用
用户 进程号 权限 命令 80/tcp: root 2020 F.... nginx nginx 2021 F.... nginx nginx 2022 F.... nginx nginx 2023 F.... nginx
# fuser -n tcp 80
80/tcp: 2020 2021 2022 2023
# ps -ef | grep nginx
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
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.网络文件(例如:NFS file、网络socket,unix域名socket) 9.还有其它类型的文件,等等
lsof的选项
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
1、查看端口占用
lsof -i:80 # nc -l 80 (nc方式) Ncat: bind to :::80: Address already in use. QUITTING.
ss方式查看80端口占用
ss -lp src :80
查看接入网络的应用
lsof -P -i -n
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。
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、查看某个进程打开的文件描述符数量
# lsof -p 2486 |wc -l (nginx master进程) 59
4、看下哪些进程占用的文件描述符比较多,排序
# 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剩余情况
$ 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号
$ ls -i fm-package 100891313 fingerprint-celery.tar.gz 34343355 fingerprint-web
列出某个用户打开的文件信息
lsof -u username
列出某个程序进程所打开的文件信息
lsof -c pycharm
列出某个用户的所有活跃的网络端口
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)
列出所有网络文件系统
lsof -N
5、已知进程pid,查进程用户
查看进程ID
#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目录并进入此目录
# cd /proc/2486
在进程ID目录中查找exe连接,后面就是运行进程ID对应文件的绝对路径
# ll | grep exe lrwxrwxrwx 1 root root 0 Sep 24 21:01 exe -> /usr/sbin/nginx
通过软件应用名查进程,如查找 nginx的进程
# pgrep -l nginx 3706 nginx 3707 nginx 3708 nginx
可以按照进程名杀死进程
pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。
pkill gaim
根据进程查软件名 ps -p 进程id
ps -p 2486 PID TTY TIME CMD 2486 ? 00:00:00 nginx
查看进程号占用的端口
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))
根据软件名查找监听端口
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
或者
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恢复被删数据
误删除文件且进程还在
#备份 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这个文件删掉
rm /var/log/messages
删掉之后,我再来看看这个进程的变化
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查看一下
# 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),看看文件是不是我们要的文件:
> 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
对比备份文件:
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
对比发现数据是一样的,恢复
cat 1 > /var/log/messages 依情况而定,有可能是2或者4
误删除文件且进程不存在(extundelete工具)
这种情况一般是没有守护进程或者后台进程对其持续输入,所以删除就删除了,lsof也看不到。就要借助于工具。这里我们采用的工具是extundelete第三方工具。恢复步骤如下:
1.停止对当前分区做任何操作,防止inode被覆盖。inode被覆盖基本就告别恢复了。比如停止所在分区的服务,卸载目录所在的设备,有必要的情况下都可以断网。
2.通过dd命令对当前分区进行备份,防止第三方软件恢复失败导致数据丢失。适合数据非常重要的情况,这里测试,就没有备份,如备份可以考虑如下方式:
https://mp.weixin.qq.com/s/2NA5kQ1ta6HJNo2HrSTajg 有待学习
df -i /var/log/nginx/error.log Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/cl-root 23150592 44428 23106164 1% /
7、列出所有的网络链接
#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)
根据文件描述范围列出文件信息
#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