lsof命令使用

安装lsof

[root@miner_k ~]# yum -y install lsof

lsof简介

lsof(list open files)是一个列出当前系统打开文件的工具。在Unix中一切(包括网络套接口)都是文件。

下面的一些其它东西需要牢记:
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数

  • -a : 结果进行“与”运算(而不是“或”)
  • -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
  • -u username 显示所属user进程打开的文件
  • -d FD 显示指定文件描述符的进程
  • +d /DIR/ 显示目录下被进程打开的文件
  • +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
  • -l : 在输出显示用户ID而不是用户名
  • -h : 获得帮助
  • -t : 仅获取进程ID
  • -U : 获取UNIX套接口地址
  • -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
[root@miner_k proc]# lsof | head
COMMAND     PID   USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
init          1   root  cwd       DIR              202,2      4096          2 /
init          1   root  rtd       DIR              202,2      4096          2 /
init          1   root  txt       REG              202,2    150352    1836484 /sbin/init
init          1   root  DEL       REG              202,2              1572895 /lib64/libnss_files-2.12.so
init          1   root  DEL       REG              202,2              1572879 /lib64/libc-2.12.so
init          1   root  mem       REG              202,2     90880    1573268 /lib64/libgcc_s-4.4.7-20120601.so.1
init          1   root  DEL       REG              202,2              1572907 /lib64/librt-2.12.so
init          1   root  DEL       REG              202,2              1572903 /lib64/libpthread-2.12.so
init          1   root  mem       REG              202,2    265728    1572958 /lib64/libdbus-1.so.3.4.0
COMMAND进程的名称
PID进程标识符
USER进程所有者
FD文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE文件类型,如DIR、REG等
DEVICE指定磁盘的名称
SIZE文件的大小
NODE索引节点(文件在磁盘上的标识)
NAME打开文件的确切名称

获取网络信息

-i 显示所有的连接
[root@miner_k ~]# lsof -i
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient  1004   root    5u  IPv4  11280      0t0  UDP *:bootpc 
sshd     10629   root    3u  IPv4  37668      0t0  TCP *:ssh (LISTEN)
sshd     10629   root    4u  IPv6  37671      0t0  TCP *:ssh (LISTEN)
httpd    17536   root    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
httpd    17540 daemon    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
httpd    17541 daemon    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
-i4 获取IPV4的连接
[root@miner_k ~]# lsof -i4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient  1004 root    5u  IPv4  11280      0t0  UDP *:bootpc 
sshd     10629 root    3u  IPv4  37668      0t0  TCP *:ssh (LISTEN)
sshd     61903 root    3u  IPv4 301534      0t0  TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
-itcp 显示tcp的连接
[root@miner_k ~]# lsof -itcp
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    10629   root    3u  IPv4  37668      0t0  TCP *:ssh (LISTEN)
sshd    10629   root    4u  IPv6  37671      0t0  TCP *:ssh (LISTEN)
httpd   17536   root    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
httpd   17540 daemon    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
-i :port 显示端口的连接
[root@miner_k ~]# lsof -i :22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    10629 root    3u  IPv4  37668      0t0  TCP *:ssh (LISTEN)
sshd    10629 root    4u  IPv6  37671      0t0  TCP *:ssh (LISTEN)
sshd    61903 root    3u  IPv4 301534      0t0  TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
基于主机和端口的连接
[root@miner_k ~]# lsof -i @192.168.6.104:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    61903 root    3u  IPv4 301534      0t0  TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
找出监控状态或已经建立连接状态的进程
[root@miner_k ~]# lsof -i | grep -i listen
sshd     10629   root    3u  IPv4  37668      0t0  TCP *:ssh (LISTEN)
sshd     10629   root    4u  IPv6  37671      0t0  TCP *:ssh (LISTEN)
httpd    17536   root    4u  IPv6 206977      0t0  TCP *:http (LISTEN)
httpd    17540 daemon    4u  IPv6 206977      0t0  TCP *:http (LISTEN)


[root@miner_k ~]# lsof -i | grep -i establish
sshd     61903   root    3u  IPv4 301534      0t0  TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)

通过用户名称查询相关的进程

查看指定用户打开的进程
[root@miner_k ~]# lsof -u mysql
COMMAND   PID  USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
mysqld  48891 mysql  cwd    DIR              202,2      4096 1180311 /var/lib/mysql
mysqld  48891 mysql  rtd    DIR              202,2      4096       2 /
mysqld  48891 mysql  txt    REG              202,2 254036696 1712987 /usr/local/mysql-5.7.17-linux-glibc2.5-x86_64/bin/mysqld
mysqld  48891 mysql  mem    REG              202,2    111440 1572943 /lib64/libresolv-2.12.so
mysqld  48891 mysql  mem    REG              202,2     27896 1572892 /lib64/libnss_dns-2.12.so
mysqld  48891 mysql  mem    REG              202,2     66432 1572938 /lib64/libnss_files-2.12.so
查看除了某个用户打开的进程
[root@miner_k ~]# lsof -u ^root | head
COMMAND   PID   USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
httpd   17540 daemon  cwd    DIR              202,2      4096       2 /
httpd   17540 daemon  rtd    DIR              202,2      4096       2 /
httpd   17540 daemon  txt    REG              202,2   2007777 1711287 /usr/local/apache/bin/httpd
httpd   17540 daemon  mem    REG              202,2     27896 1572892 /lib64/libnss_dns-2.12.so
httpd   17540 daemon  mem    REG              202,2     66432 1572938 /lib64/libnss_files-2.12.so
httpd   17540 daemon  mem    REG              202,2    122056 1572946 /lib64/libselinux.so.1
httpd   17540 daemon  mem    REG              202,2    111440 1572943 /lib64/libresolv-2.12.so
杀掉某一用户运行的所有进程

[root@miner_k ~]# kill -9 $(lsof -t -u mysql)

同时满足多个选项

[root@miner_k ~]# lsof -a -u root -d txt
COMMAND     PID USER  FD      TYPE DEVICE SIZE/OFF    NODE NAME
init          1 root txt       REG  202,2   150352 1836484 /sbin/init
kthreadd      2 root txt   unknown                         /proc/2/exe
migration     3 root txt   unknown                         /proc/3/exe
ksoftirqd     4 root txt   unknown                         /proc/4/exe
stopper/0     5 root txt   unknown                         /proc/5/exe
watchdog/     6 root txt   unknown                         /proc/6/exe
events/0      7 root txt   unknown                         /proc/7/exe

恢复删除的文件

    当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。 


    在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 

    当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:

测试:

[root@miner_k /]# mv /var/log/messages{,.bak}
[root@miner_k /]# lsof | grep /var/log/messages
rsyslogd   1368   root    4w      REG              202,2     59558    1181164 /var/log/messages

[root@miner_k /]# cat /proc/1368/fd/4 > /var/log/messages
messages-20170722.gz  messages.bak          
[root@miner_k /]# cat /proc/1368/fd/4 > /var/log/messages
<think>好的,我现在需要帮助用户了解如何使用lsof命令。首先,用户的问题是关于lsof的用法,所以我要先整理这个命令的基本功能、常用参数和典型应用场景。根据用户提供的引用资料,我需要确保信息准确,并正确引用来源。 首先,lsof的主要作用是列出被进程打开的文件。由于Linux中一切皆文件,所以这包括普通文件、目录、套接字、设备等。引用[3]和[4]都提到了这一点,特别是引用[4]提到lsof可以查看所有已打开的文件类型。我需要强调这一点,并说明为什么需要root权限,如引用[1]和[3]所说,因为访问核心内存和某些文件需要权限。 接下来是基本用法。用户可能想知道最简单的命令形式,比如直接运行`lsof`会列出所有打开的文件,但这样信息太多,可能需要结合参数使用。这里可以提到常用的参数,比如`-c`指定进程名,`-p`指定PID,`-u`指定用户,这些在引用[4]中有涉及。 然后,常用参数和示例。这里需要详细列出每个参数的作用,并给出例子。例如,`lsof -u username`显示特定用户打开的文件,引用[3]提到了用户权限的问题,所以需要提醒可能需要sudo。`-i`参数用于网络连接,引用[2]提到-P和-n参数提升速度,可以建议用户结合使用,比如`lsof -i :80`查看80端口的进程。此外,查看被删除的文件用`lsof +L1`,引用[3]和[4]都提到了这一点。 实际应用案例部分,用户可能需要具体的场景,比如恢复删除文件、查看端口占用、分析进程文件等。这里需要结合引用中的信息,比如恢复文件需要找到进程和文件描述符,引用[3]和[4]都有相关说明。查看端口占用时,引用[2]提到的-P和-n参数可以加快执行速度,可以建议用户使用。 注意事项部分,要提到权限问题,如引用[1]和[3]所说,普通用户可能需要sudo。性能方面,引用[2]提到-P和-n可以提升速度,避免解析主机名和端口号。此外,输出结果较多时,可以结合grep过滤,这是常见做法,但引用中没有提到,可能需要根据一般知识补充。 相关问题部分,用户可能想知道如何安装lsof、结合其他命令使用、解决权限问题等。这里需要根据常见问题生成,比如安装命令、与grep或awk的组合使用,以及权限不足的解决方法,引用[1]提到sudo权限,可以引用。 整个过程中,需要确保每个引用都正确对应到用户提供的引用资料,并且自然地在回答末尾添加引用标识。同时,保持回答结构清晰,分点说明,便于用户理解。最后,检查是否所有数学公式和独立公式都符合格式要求,虽然这个问题不涉及数学内容,但可能需要确认是否有其他格式问题。</think>### 如何高效使用 `lsof` 命令? `lsof`(List Open Files)是 Linux 系统中用于查看进程打开文件的工具,支持分析普通文件、目录、网络连接、设备文件等[^3][^4]。以下是详细用法: --- #### **1. 基础用法** - **列出所有打开的文件**(需 root 权限或 `sudo`): ```bash sudo lsof ``` 输出可能包含: - `COMMAND`:进程名称 - `PID`:进程 ID - `USER`:运行进程的用户 - `FD`:文件描述符(如 `cwd` 表示当前目录) - `TYPE`:文件类型(如 `REG` 普通文件,`DIR` 目录,`IPv4` 网络套接字) --- #### **2. 常用参数与示例** | 参数 | 用途 | 示例 | |------|------|------| | `-c <进程名>` | 筛选特定进程 | `lsof -c nginx`(查看 nginx 打开的文件) | | `-p <PID>` | 按进程 ID 筛选 | `lsof -p 1234`(查看 PID 1234 的打开文件) | | `-u <用户名>` | 按用户筛选 | `lsof -u www-data`(查看用户 www-data 的文件) | | `-i` | 查看网络连接 | `lsof -i :80`(查看占用 80 端口的进程)[^2] | | `+d <目录>` | 查看目录下的打开文件 | `lsof +d /var/log`(分析日志目录)[^1] | | `-L` | 显示文件链接数 | `lsof -L1`(查找已删除但仍被进程占用的文件) | --- #### **3. 实际应用场景** 1. **恢复被删除的文件** 若文件被删除但进程仍占用,可通过以下步骤恢复: ```bash lsof | grep deleted # 查找被删除的文件(如 /path/to/file (deleted)) ``` 从输出中获取 `PID` 和 `FD`(如 `1234 1w`),通过 `/proc` 目录恢复: ```bash cp /proc/1234/fd/1 /path/to/restored_file ``` 2. **排查端口占用** ```bash lsof -i :8080 -nP # 使用 `-nP` 提升速度(不解析主机名和端口名) ``` 3. **分析进程文件依赖** ```bash lsof -p $(pidof python) # 查看 Python 进程打开的文件 ``` --- #### **4. 注意事项** - **权限问题**:普通用户需通过 `sudo` 执行 `lsof` 以获取完整信息[^1]。 - **性能优化**:使用 `-n`(不解析主机名)和 `-P`(不解析端口名)可加快命令执行[^2]。 - **结果过滤**:结合 `grep` 或 `awk` 过滤输出,例如 `lsof -i | grep ESTABLISHED`。 --- §§ 相关问题 §§ 1. `lsof` 命令如何安装? (答:多数 Linux 发行版默认包含;若无,可通过 `apt install lsof` 或 `yum install lsof` 安装) 2. 如何结合 `lsof` 和 `grep` 查找特定文件? (答:如 `lsof | grep "/var/log/nginx"` 查看该路径下的打开文件) 3. 为什么 `lsof` 需要 root 权限? (答:访问内核信息和受保护文件需要特权[^3]) 4. 如何统计系统当前打开的文件总数? (答:`lsof | wc -l`,但需注意权限和性能影响)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值