lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

选项

选项 描述
-a 列出打开文件存在的进程;
-c<进程名> 列出指定进程所打开的文件;
-g 列出GID号进程详情;
-d<文件号> 列出占用该文件号的进程;
+d<目录> 列出目录下被打开的文件;
+D<目录> 递归列出目录下被打开的文件;
-n<目录> 列出使用NFS的文件;
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件;
-u 列出UID号进程详情;
-h 显示帮助信息;
-v 显示版本信息。

如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。由于输出内容太多,这里只取前十行作为示例,如下:

[root@centos7 ~]# lsof |sed -n '1,10p'
COMMAND   PID TID USER   FD   TYPE        DEVICE  SIZE/OFF      NODE NAME
systemd    1       root  cwd  DIR         253,0       224         64 /
systemd    1       root  rtd  DIR         253,0       224         64 /
systemd    1       root  txt  REG         253,0   1632776   34111359 /usr/lib/systemd/systemd
systemd    1       root  mem  REG         253,0     20064   33612035 /usr/lib64/libuuid.so.1.3.0
systemd    1       root  mem  REG         253,0    265576   33930342 /usr/lib64/libblkid.so.1.1.0
systemd    1       root  mem  REG         253,0     90248   33612015 /usr/lib64/libz.so.1.2.7
systemd    1       root  mem  REG         253,0    157424   33612020 /usr/lib64/liblzma.so.5.2.2
systemd    1       root  mem  REG         253,0     23968   33612146 /usr/lib64/libcap-ng.so.0.0.0
systemd    1       root  mem  REG         253,0     19896   33612136 /usr/lib64/libattr.so.1.1.0

可以看到输出内容中都包含这些信息:

COMMAND 进程的名称
PID 进程标识符
PPID 父进程标识符(需要指定-R参数)
USER 进程所有者
PGID 进程所属组
FD 文件描述符,应用程序通过文件描述符识别该文件。
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称

下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件;还有一部分 FD 是以数字表示的,比如标准输入输出文件:数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

docker-co  19350 19941    root    0r      CHR                1,3       0t0       7516 /dev/null
docker-co  19350 19941    root    1u     unix 0xffff97f6356ed940       0t0     131546 socket
docker-co  19350 19941    root    2u     unix 0xffff97f6356ed940       0t0     131546 socket
docker-co  19350 19941    root    3u     unix 0xffff97f6356e9980       0t0     131548 /var/run/docker/libcontainerd/docker-containerd.sock
docker-co  19350 19941    root    4u  a_inode               0,10         0       7512 [eventpoll]
docker-co  19350 19941    root    5u  a_inode               0,10         0       7512 [eventpoll]
docker-co  19350 19941    root    6w      REG               0,20      1604     102553 /run/docker/libcontainerd/containerd/events.log
docker-co  19350 19941    root    7u     unix 0xffff97f62a61d0c0       0t0     131551 /var/run/docker/libcontainerd/docker-containerd.sock

FD文件描述符列表

cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX)(库引用);
er:FD information error (see NAME column)(fd信息错误);
jld:jail directory (FreeBSD)(监控目录);
ltx:shared library text (code and data)(共享库文本);
mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx);
m86:DOS Merge mapped file(DOS合并映射文件);
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:

N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁);
r:for read lock on part of the file(用于对文件的一部分进行读取锁定);
R:for a read lock on the entire file(整个文件的读取锁定);
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length(对于任意长度的读写锁);
U:for a lock of unknown type(对于未知类型的锁);
x:for an SCO OpenServer Xenix lock on part of the file(对于文件的sco openserver xenix锁);
X:for an SCO OpenServer Xenix lock on the entire file(对于整个文件的sco openserver xenix锁);
space:if there is no lock(如果没有锁).

type列文件类型

TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

常见用法

查看哪些进程打开了某个文件

直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程:

[root@centos7 ~]# lsof /bin/bash
COMMAND    PID USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
bash      1927 root txt    REG  253,0   964536 7962 /usr/bin/bash
bash    123127 root txt    REG  253,0   964536 7962 /usr/bin/bash

除了普通文件,也可以是设备等文件

[root@centos7 ~]# lsof /dev/sda1

查看哪些进程打开了某个目录及目录下的文件

这里分两种情况,+d 选项不执行递归查询,只查找那些打开了指定目录以及指定目录下文件和目录的进程,比如:

[root@centos7 ~]# lsof +d /var/log
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
VGAuthSer  690 root    2w   REG  253,0     2782 67727156 /var/log/vmware-vgauthsvc.log.0
VGAuthSer  690 root    4w   REG  253,0     2782 67727156 /var/log/vmware-vgauthsvc.log.0
vmtoolsd   691 root    3w   REG  253,0  4270806 67727158 /var/log/vmware-vmsvc-root.log
firewalld  717 root    3w   REG  253,0     3477 67727162 /var/log/firewalld
rsyslogd  1043 root    6w   REG  253,0    13887 67728289 /var/log/cron
rsyslogd  1043 root    7w   REG  253,0   141042 67728290 /var/log/messages
rsyslogd  1043 root    8w   REG  253,0    10753 67728291 /var/log/secure
rsyslogd  1043 root    9w   REG  253,0      159 67148175 /var/log/maillog

而 +D 选项则会对指定的目录进行递归:

[root@centos7 ~]# lsof +D /var/log
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
auditd     664 root    5w   REG  253,0   628670 67727152 /var/log/audit/audit.log
VGAuthSer  690 root    2w   REG  253,0     2782 67727156 /var/log/vmware-vgauthsvc.log.0
VGAuthSer  690 root    4w   REG  253,0     2782 67727156 /var/log/vmware-vgauthsvc.log.0
vmtoolsd   691 root    3w   REG  253,0  4270806 67727158 /var/log/vmware-vmsvc-root.log
firewalld  717 root    3w   REG  253,0     3477 67727162 /var/log/firewalld
tuned     1037 root    3w   REG  253,0     2847 34366713 /var/log/tuned/tuned.log
rsyslogd  1043 root    6w   REG  253,0    13887 67728289 /var/log/cron
rsyslogd  1043 root    7w   REG  253,0   141042 67728290 /var/log/messages
rsyslogd  1043 root    8w   REG  253,0    10753 67728291 /var/log/secure
rsyslogd  1043 root    9w   REG  253,0      159 67148175 /var/log/maillog

可以看到,加了+D后,不仅显示打开/var/log目录下文件的进程,该命令还列出了打开/var/log/audit/audit.log文件的进程。

在卸载文件系统时,如果有进程打开了该文件系统中的文件或目录,卸载操作就会失败。因此最好在卸载文件系统前通过 lsof +D 检查文件系统的挂载点,杀掉相关的进程然后再执行卸载操作。

查看某个进程打开的所有文件

通过 -p 选项并指定进程的 PID 可以输出该进程打开的所有文件。比如我们想要查看 sshd 程序打开的文件,可以先用 ps -C 命令查出进程的 PID:

[root@centos7 ~]# ps -C sshdPID TTY          TIME CMD1039 ?        00:00:00 sshd
123123 ?        00:00:00 sshd

然后把该 PID 传递给 lsof 命令的 -p 选项:

[root@centos7 ~]# lsof -p 123123
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
sshd    123123 root  cwd    DIR              253,0      224       64 /
sshd    123123 root  rtd    DIR              253,0      224       64 /
sshd    123123 root  txt    REG              253,0   852856 34227119 /usr/sbin/sshd
sshd    123123 root  mem    REG              253,0    15488 67504525 /usr/lib64/security/pam_lastlog.so
sshd    123123 root  mem    REG              253,0    15648 34014874 /usr/lib64/libpam_misc.so.0.82.0

组合多个选项

如果为 lsof 命令指定多个选项,这些选项间默认是或的关系。也就是说满足任何一个选项的结果都会被输出。可以添加额外的 -a 选项,它的作用就是让其它选项之间的关系变为与,比如下面的命令:

[root@centos7 ~]# lsof -a -p $$ -d0,1,2  #也可以表示为-d0-2
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    123127 root    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    123127 root    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    123127 root    2u   CHR  136,0      0t0    3 /dev/pts/0

其中的 -p 选项指定了当前进程的 PID,而 -d 选项则用来指定进程打开的文件描述符(可以通过逗号分隔多个文件描述符)。添加 -a 选项后,结果输出为当前进程打开的文件描述符为 0-2 的文件。

查看指定名称的程序打开的文件

通过 -c 选项可以匹配进程运行的程序(可执行文件)名称。比如我们要查找以字母 cr 开头的程序打开的文件列表:

[root@centos7 ~]# lsof -c cr
COMMAND   PID USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
crypto     38 root  cwd       DIR              253,0       224        64 /
crypto     38 root  rtd       DIR              253,0       224        64 /
crypto     38 root  txt   unknown                                        /proc/38/exe
crond   98878 root  cwd       DIR              253,0       224        64 /
crond   98878 root  rtd       DIR              253,0       224        64 /
crond   98878 root  txt       REG              253,0     70216  34185366 /usr/sbin/crond

备注: -c 选项将会列出所有cr开头的程序的文件,其实你也可以写成lsof | grep cr,但是第一种方法明显比第二种方法要少打几个字符了

还可以同时指定多个 -c 选项,它们之间是或的关系。

[root@centos7 ~]# lsof -c cr -c ssh
COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
crypto      38 root  cwd       DIR              253,0       224        64 /
crypto      38 root  rtd       DIR              253,0       224        64 /
crypto      38 root  txt   unknown                                        /proc/38/exe
sshd      1039 root  cwd       DIR              253,0       224        64 /
sshd      1039 root  rtd       DIR              253,0       224        64 /
sshd      1039 root  txt       REG              253,0    852856  34227119 /usr/sbin/sshd

如果想对 -c 选项的条件取反,只要在字符串前添加符号 ^ 就可以了,比如:

lsof -c ^cr

-c 选项也支持正则表达式,比如下面的命令可以过滤出以 cra 和 cro 开头的程序打开的文件:

[root@centos7 ~]# lsof -c /cr[ao]/
COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
crond    98878 root  cwd       DIR              253,0       224        64 /
crond    98878 root  rtd       DIR              253,0       224        64 /
crond    98878 root  txt       REG              253,0     70216  34185366 /usr/sbin/crond
anacron 125475 root  cwd       DIR              253,0        63  67575706 /var/spool/anacron
anacron 125475 root  rtd       DIR              253,0       224        64 /
anacron 125475 root  txt       REG              253,0     36448  34185364 /usr/sbin/anacron

查看被打开的与网络相关的文件

-i 选项用来查看被打开的和网络相关的文件,其参数的格式如下:
[46][protocol][@hostname|hostaddr][:service|port]
46 表示 IP 协议的版本
protocol 表示网络协议的名称,比如 TCP 或 UDP
hostname 或 hostaddr 表示主机地址
service 指 /etc/services 中的名称,比如 smtp 或多个服务的列表
port 表示端口号,可以指定一个或多个

-i 选项默认会同时输出 IPv4 和 IPv6 打开的文件:

[root@centos7 ~]# lsof -i
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1039 root    3u  IPv4  20294      0t0  TCP *:ssh (LISTEN)
sshd      1039 root    4u  IPv6  20296      0t0  TCP *:ssh (LISTEN)
sshd    123123 root    3u  IPv4 338066      0t0  TCP centos7:ssh->192.168.220.1:49880 (ESTABLISHED)

只列出 IPv4 或 IPv6 打开的文件:

[root@centos7 ~]# lsof -i 4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1039 root    3u  IPv4  20294      0t0  TCP *:ssh (LISTEN)
sshd    123123 root    3u  IPv4 338066      0t0  TCP centos7:ssh->192.168.220.1:49880 (ESTABLISHED)[root@centos7 ~]# lsof -i 6
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1039 root    4u  IPv6  20296      0t0  TCP *:ssh (LISTEN)

列出与 22 号端口相关的文件:

[root@centos7 ~]# lsof -i:22
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1039 root    3u  IPv4  20294      0t0  TCP *:ssh (LISTEN)
sshd      1039 root    4u  IPv6  20296      0t0  TCP *:ssh (LISTEN)
sshd    123123 root    3u  IPv4 338066      0t0  TCP centos7:ssh->192.168.220.1:49880 (ESTABLISHED)

列出指定范围内被打开的 TCP 端口

[root@centos7 ~]# lsof -i TCP:1-1024
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
rpcbind   743  rpc    8u  IPv4   19722      0t0  TCP *:sunrpc (LISTEN)
rpcbind   743  rpc   11u  IPv6   19725      0t0  TCP *:sunrpc (LISTEN)
sshd     1134 root    3u  IPv4   27597      0t0  TCP *:ssh (LISTEN)
sshd     1134 root    4u  IPv6   27599      0t0  TCP *:ssh (LISTEN)
cupsd    1138 root   10u  IPv6   27613      0t0  TCP localhost:ipp (LISTEN)
cupsd    1138 root   11u  IPv4   27614      0t0  TCP localhost:ipp (LISTEN)
master   1645 root   13u  IPv4   30785      0t0  TCP localhost:smtp (LISTEN)
master   1645 root   14u  IPv6   30786      0t0  TCP localhost:smtp (LISTEN)
sshd    91968 root    3u  IPv4 1499391      0t0  TCP Hank:ssh->192.168.220.1:49879 (ESTABLISHED)

查看被打开的 UNIX domain socket 文件

-U 选项输出打开的 UNIX domain socket 文件,这里我们结合 -c 选项来查看 mysql服务打开的 UNIX domain socket 文件:

[root@centos7 ~]# lsof -a -c mysqld -U
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
mysqld_sa 94145  root    2u  unix 0xffff9b23119ad500      0t0 773970 socket
mysqld    94297 mysql   26u  unix 0xffff9b23119ab300      0t0 774047 /tmp/mysqld.sock

查看某个用户打开的所有文件

-u 选项可以指定用户名或 user ID,并且和 -c 选项一样,可以通过逗号分隔多个用户名称或 user ID,也可以通过符号 ^ 对条件取反。
查看某个用户打开的所有文件:

[root@centos7 ~]# lsof -u root
bash      123127 root  cwd       DIR              253,0       195  100663361 /root
bash      123127 root  rtd       DIR              253,0       224         64 /
bash      123127 root  txt       REG              253,0    964536       7962 /usr/bin/bash
...

查看用户 root 打开的网络相关的文件

[root@centos7 ~]# lsof -a -i -u root
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1039 root    3u  IPv4  20294      0t0  TCP *:ssh (LISTEN)
sshd      1039 root    4u  IPv6  20296      0t0  TCP *:ssh (LISTEN)
sshd    123123 root    3u  IPv4 338066      0t0  TCP centos7:ssh->192.168.220.1:49880 (ESTABLISHED

排除某个用户

[root@Hank ~]# lsof -i -u ^root
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind     743    rpc    6u  IPv4  19720      0t0  UDP *:sunrpc
rpcbind     743    rpc    7u  IPv4  19721      0t0  UDP *:915
rpcbind     743    rpc    8u  IPv4  19722      0t0  TCP *:sunrpc (LISTEN)
rpcbind     743    rpc    9u  IPv6  19723      0t0  UDP *:sunrpc
rpcbind     743    rpc   10u  IPv6  19724      0t0  UDP *:915
rpcbind     743    rpc   11u  IPv6  19725      0t0  TCP *:sunrpc (LISTEN)
avahi-dae   782  avahi   12u  IPv4  22968      0t0  UDP *:mdns
avahi-dae   782  avahi   13u  IPv4  22969      0t0  UDP *:22582

注意:在有排除条件时,不需要指定 -a 选项。

杀掉某个用户打开了文件的所有进程

kill -9 $(lsof -t -u beyo)

该命令中的 -t 选项让 lsof 命令只输出进程的 PID:

[root@Hank ~]# lsof -t -i:22
1134
91968

统计系统打开的文件总数

[root@Hank ~]# lsof -P -n |wc -l
25571

命令中的 -P 选项表示不解析端口号,-n 选项表示不解析主机名,这两个选项主要的目的是为了提升 lsof 命令的执行速度。wc -l 命令则用来统计 lsof 命令输出的行数。

恢复删除的文件

如果我们一不小心删除了文件,而又知道这个文本被某个进程打开着,就可以通过 lsof 命令来恢复该文件。具体的原理为:
当进程打开了某个文件时,只要该进程保持打开该文件,即使将文件删除,它依然存在于磁盘中。进程并不知道文件已经被删除,它仍然可以通过打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。

进程打开的文件描述符就存放在 /proc/PID/fd 目录下。/proc 目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。lsof 程序就是使用这些信息和其他关于内核内部状态的信息来产生其输出。所以 lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是说我们通过访问进程的文件描述符可以找到该文件的相关信息。

下面的 demo 演示如何通过 lsof 命令恢复被误删的 /var/log/maillog 文件。

先删除日志文件 /var/log/maillog,记着要提前备份一下这个文件,以防万一:

[root@Hank log]# cp mysql.log  mysql.log.bak
[root@Hank log]# ll | grep mysql
-rw-r-----. 1 mysql  root    131355 Jul  7 08:14 mysql.log
-rw-r-----  1 root   root    131355 Jul  7 09:43 mysql.log.bak

删除mysql.log文件:

[root@Hank log]# rm mysql.log
rm: remove regular file ‘mysql.log’? y
[root@Hank log]# lsof mysql.log
lsof: status error on mysql.log: No such file or directory
[root@Hank log]# lsof -u mysql | grep /var/log/mysql.log
mysqld  94297 mysql    1w   REG              253,0    131355 106804394 /var/log/mysql.log (deleted)
mysqld  94297 mysql    2w   REG              253,0    131355 106804394 /var/log/mysql.log (deleted)

从上面的信息可以看到 PID 为 94297 的进程打开着该文件,文件描述符为 1和2,并且显示该文件已经被删除了。接下来我们通过 95297号进程的文件文件描述符来查看该文件的内容:

[root@Hank log]# tail -n 5 /proc/94297/fd/1
2022-07-04T00:06:36.066023Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 223413816ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
2022-07-05T02:07:12.244310Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 58279732ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
2022-07-06T00:38:27.858214Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 51369381ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
2022-07-06T07:41:06.422822Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 17003ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
2022-07-07T00:14:24.309117Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 51373796ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)

说明文件 /var/log/mysql.log 文件的内容还在,并且可以通过文件描述符访问,接下来通过 IO 重定向的方式重新创建 /var/log/mysql.log文件就可以了:

sh -c 'cat /proc/94397/fd/1 > /var/log/mysql.log'

然后修复文件的权限属性并重启 mysqld 服务:

[root@Hank log]# ll | grep mysql
-rw-r--r--  1 root   root    131355 Jul  7 09:50 mysql.log
-rw-r-----  1 root   root    131355 Jul  7 09:43 mysql.log.bak
[root@Hank log]# chown mysql mysql.log
[root@Hank log]# ll | grep mysql
-rw-r--r--  1 mysql  root    131355 Jul  7 09:50 mysql.log
-rw-r-----  1 root   root    131355 Jul  7 09:43 mysql.log.bak
[root@Hank log]# systemctl restart mysqld

这样就完成了 /var/log/mysql.log文件的恢复工作。对于许多应用程序,尤其是日志文件和数据库文件,都可以通过这种方式来恢复。

lsof 并不是一个简单的命令,还有更多强大的功能。从本文介绍的小 demo 入手,一步步的开始使用并最终掌握这个命令吧。

Linux中的lsof相关推荐

  1. linux中的lsof命令简介

    我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子. 比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际 ...

  2. linux中time命令详解、脚本监控记录系统硬盘io值、定位linux系统中await值过高占用的盘、定位占用硬盘IO高的程序、iotop命令说明、lsof使用说明【可定位端口所占用程序等】

    文章目录 文章说明 linux中的time命令 说明&常规用法 bash中使用time,将运行记录追加到文件中,-f后的参数说明 高阶用法 time 命令详细输出指标介绍 ime taken ...

  3. linux的lsof命令,Linux中lsof命令起什么作用呢?

    摘要: 下文讲述Linux中lsof的功能说明,如下所示: lsof命令功能: 用于查看进程打开的文件 lsof命令的语法格式: lsof [参数] [文件] -----常用参数说明------ -a ...

  4. Linux操作系统上lsof命令详解

    Linux操作系统上lsof命令详解 2011-10-08 18:31:31 http://xjsunjie.blog.51cto.com/999372/682865 标签:Linux lsof命令 ...

  5. Linux中检查本地系统上的开放端口列表的方法

    在 Linux 中很少有用于此目的的实用程序.然而,我提供了四个最重要的 Linux 命令来检查这一点. 你可以使用以下四个命令来完成这个工作.这些命令是非常出名的并被 Linux 管理员广泛使用. ...

  6. linux中85379端口如何恢复,技术|如何在 Linux/Unix 系统中验证端口是否打开

    在 Linux 或者类 Unix 中,我该如何检查某个端口是否被占用?我又该如何验证 Linux 服务器中有哪些端口处于监听状态? 验证哪些端口在服务器的网络接口上处于监听状态是非常重要的.你需要注意 ...

  7. Linux中常见命令和单词的缩写全称

    Linux中常见命令和单词的缩写全称 文章目录: 参考 ls:list(列出目录内容)cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat ...

  8. linux中rm删除的文件是否可以恢复,Linux下用rm删除的文件的恢复方法

    Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站 https://www.linuxidc.com/Linux/2008-08/14744.htm lin ...

  9. linux:进程占用的端口,在linux中查看进程占用的端口号

    在Linux 上的 /etc/services 文件可以查看到更多关于保留端口的信息. 可以使用以下六种方法查看端口信息. ss:可以用于转储套接字统计信息. netstat:可以显示打开的套接字列表 ...

最新文章

  1. RISC-V架构上的Debian和Fedora现状
  2. 每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?
  3. Adapterview和adapter的联系
  4. 【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)...
  5. mysql锁机制(Innodb引擎)
  6. linux perl telnet安装,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  7. RSA加密-解密以及解决超长内容加密失败解决
  8. ReactiveCocoa核心元素与信号流
  9. swagger2maven依赖_Maven + SpringMVC项目集成Swagger
  10. hive内置函数详解
  11. 40. 后台模块开发(5)
  12. 教训:LINUX复制文件到U盘丢失
  13. iSCSI远程块存储配置实验
  14. 高斯分布matlab程序,生成高斯分布的matlab程序
  15. Oracle 重置过期密码,Oracle重置过期的密码
  16. H3CSE路由-BGP属性
  17. 用xbuilder开发遇到的问题
  18. 漫威对决同位素实验室怎么玩
  19. 《咸鱼分享》DNS轮询
  20. JSON格式转MAP集合

热门文章

  1. ANTLR4入门(一):Windows安装antlr4命令行环境
  2. HM16.0之帧内模式——xCheckRDCostIntra()函数
  3. 如何快速记忆一副无规律扑克牌
  4. 前序、中序、后序。(中序最重要)
  5. 【机器学习基础】(一) 爬山算法 ( Hill Climbing )与模拟退火(SA,Simulated Annealing)
  6. 计算机配置的网关,电脑的默认网关怎么设置?
  7. 在Excel中调用Python脚本,实现数据自动化处理
  8. 学弟研一,有几篇SCI论文,做过前端,读博 or 走开发进国企?
  9. DoubleTake for Mac(全景拼图软件)
  10. Vue全家桶项目创建指南