一、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
# pgrep nginx(通过进程名查进程)
# pgrep -l nginx
3706 nginx
3707 nginx
3708 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
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
2、查看系统当前打开的文件描述符数量
第一个数表示当前系统分配后已使用的文件描述符数,第二个数表示分配后未使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),第三个数等于最大值f。
# cat /proc/sys/fs/file-nr
1440 0 176997
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、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
2380464 backend 75826734 fingerprint-models.tar.gz 18993949 frontend
100891313 fingerprint-celery.tar.gz 34343355 fingerprint-web 100891311 production-scripts
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
或者ps -p port根据进程查软件名
ps -p 2486
PID TTY TIME CMD
2486 ? 00:00:00 nginx
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