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

 

 

 


 

posted @ 2020-09-16 23:10  凡人半睁眼  阅读(474)  评论(0编辑  收藏  举报