lsof 与fuser

服务器上调试程序时,有时会遇到所需资源被占用的情况,这时就要查一下是什么程序占用了资源。需要用到lsof与fuser指令。

lsof用于显示打开文件的信息

lsof  filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string   显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username  显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长l

例如

vigar@vigar-laptop:~/下载/nice$ lsof /opt/google/chrome/chrome
COMMAND  PID  USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
chrome  4913 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome
chrome  4917 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome
chrome  4919 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome

lsof查特定端口

hpcentos5-/opt/test/bin> lsof -itcp:5000
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
perl    8587 admin    3u  IPv4 510003      0t0  TCP hpcentos5:commplex-main (LISTEN)

 

fuser 的作用与lsof非常相似,也会将使用指定文件的进程信息全部列出

vigar@vigar-laptop:~/下载/nice$ fuser -v /opt/google/chrome/chrome
                     用户     进程号 权限   命令
/opt/google/chrome/chrome:
                     vigar      4913 ...e. chrome
                     vigar      4917 ...e. chrome
                     vigar      4919 ...e. chrome

     权限含义:

   c 将此文件作为当前目录使用。 
      e 将此文件作为程序的可执行对象使用。 
      r 将此文件作为根目录使用。 
      s 将此文件作为共享库(或其他可装载对象)使用

 

   fuser另一个非常有用的功能是-k,可以杀死指定进程(发SIGKILL信号)  

vigar@vigar-laptop:~/下载/nice$ fuser aaa.avi
aaa.avi:             14097
vigar@vigar-laptop:~/下载/nice$ fuser -k aaa.avi
aaa.avi:             14097
vigar@vigar-laptop:~/下载/nice$ fuser aaa.avi
vigar@vigar-laptop:~/下载/nice$ 
可知占用aaa.avi的进程已经被干掉。当然,执行这条指令需要足够的权限,有root权限最好,其它人是无法杀死别人的进程的。

 当利用lsof或fuser查出指定进程号后,即可用netstat -anp | grep pid查出其开放端口

test> netstat -anp | grep 7172
(Not all processes could be identified, non-owned process info
tcp        0      0 :::8777                     :::*                        LISTEN      7172/java           
tcp        0      0 ::ffff:10.0.7.128:23564     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23550     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:10629     ::ffff:10.0.3.91:1414       ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23562     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23572     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           

 有时在机器上查出某个进程在跑,却不知道程序部署在何处,可以用ps -ef 查出pid,用lsof| grep pid,根据得到的信息推断出程序位置

 

<think>好的,我现在要回答用户关于lsoffuser命令的用途及用法的问题。首先,我需要回顾一下自己对这些命令的了解,并参考提供的引用资料来确保准确性。 首先,lsoffuser都是Linux系统中用于处理文件和进程相关问题的工具。用户想了解它们的功能和使用方法,所以我需要分别解释这两个命令,并给出具体的例子。 根据引用[2],lsof用于列出系统中所有打开的文件及相关进程,包括常规文件、网络连接、设备文件等。而引用[5]提到lsof可以检查特定设备上的进程,比如/dev/sdb或分区sdb1。这说明lsof的用途很广,可以查看各种类型的打开文件。 接下来是fuser,引用[1]和[4]显示,fuser主要用于显示使用某个文件或端口的进程,并且可以终止这些进程。例如,当无法卸载设备时,使用fuser -k可以终止占用进程。引用[4]还给出了具体的命令示例,比如fuser -m -v /dev/sda1查看挂载点的进程,并使用-k选项终止。 接下来,我需要整理这两个命令的常见用法和选项。对于lsof,常用的选项包括-i查看网络连接,-u指定用户,-p指定进程ID等。例如,lsof /dev/sdb1可以查看该分区的使用情况。而fuser常用的选项包括-m显示挂载点进程,-v详细信息,-k终止进程,-i交互式确认等。比如fuser -k -i /dev/sdb1会终止占用该设备的进程并询问确认。 然后,我需要比较两者的区别。根据引用[5],lsof提供更详细的信息,如进程名、用户、文件描述符等,适合详细分析。而fuser更侧重于快速识别并处理占用问题,尤其是在卸载设备时更高效。 另外,要注意安装方法。引用[3]提到可能需要安装这些工具,比如在Debian/Ubuntu中使用apt-get install lsoffuser。这也是用户可能需要的信息,特别是如果系统默认未安装的话。 最后,用户可能需要相关的问题,比如如何查看特定端口的进程,或者如何安全卸载设备。根据引用[5],可以生成相关问题,例如使用lsof检查端口占用,或者使用fuser终止进程以卸载设备。 总结一下,我需要将回答分为lsoffuser两部分,各自的功能、常用选项、示例,以及两者的对比。同时,确保引用正确的资料来源,比如引用[2]和[5]对于lsof的说明,引用[4]和[5]对于fuser的示例。最后,生成相关问题,帮助用户进一步学习。</think>### lsof(8) fuser(1) 功能解析使用指南 #### 一、lsof 命令 **功能** `lsof`(List Open Files)用于列出系统中所有被打开的文件及相关进程信息,支持常规文件、网络连接、设备文件、管道等类型的文件分析[^2][^5]。 **常用选项** - `-i`:查看网络连接(如 `lsof -i :80` 显示占用80端口的进程) - `-u <用户>`:过滤指定用户打开的文件 - `-p <PID>`:查看指定进程ID打开的文件 - `-c <进程名>`:按进程名过滤(如 `lsof -c nginx`) **使用示例** 1. **查看文件占用** ```bash lsof /var/log/syslog # 显示正在使用syslog文件的进程 ``` 2. **分析网络连接** ```bash lsof -i TCP:22 # 列出使用TCP 22端口(SSH)的进程 ``` 3. **查看设备占用** ```bash lsof /dev/sdb1 # 显示访问/dev/sdb1分区的进程 ``` --- #### 二、fuser 命令 **功能** `fuser` 用于识别占用文件/目录的进程,并支持通过信号终止进程,常用于解决设备卸载失败等问题[^1][^4]。 **常用选项** - `-m`:指定挂载点(如 `/mnt/usb`) - `-v`:显示详细信息(进程号、用户、命令等) - `-k`:发送SIGKILL信号终止进程 - `-i`:终止前交互式确认 **使用示例** 1. **查看挂载点占用** ```bash fuser -m -v /dev/sda1 # 显示挂载/dev/sda1的进程[^4] ``` 2. **终止占用进程** ```bash fuser -k /mnt/usb # 强制终止访问/mnt/usb的进程 fuser -k -i /dev/sdb1 # 交互式终止/dev/sdb1的进程 ``` 3. **分析网络端口占用** ```bash fuser -v 80/tcp # 查看使用TCP 80端口的进程 ``` --- #### 三、lsof fuser 对比 | **场景** | **lsof** | **fuser** | |-----------------------|-----------------------------------|------------------------------------| | **信息详细度** | 显示完整进程、文件描述符、用户等[^5] | 仅显示进程号,适合快速处理 | | **终止进程** | 需配合`kill`命令 | 直接通过`-k`选项终止进程 | | **网络分析** | 支持协议、端口过滤(`-i`) | 仅支持端口类型(如`80/tcp`) | | **设备卸载场景** | 需手动解析输出 | 直接定位挂载点并终止进程[^4] | --- #### 四、安装方法(如系统未预装) - **Debian/Ubuntu** ```bash sudo apt install lsof # 安装lsof sudo apt install psmisc # 安装fuser[^3] ``` --- §§ 相关问题 §§ 1. 如何用`lsof`查看某个用户打开的所有文件? 2. `fuser`终止进程时如何避免误操作? 3. 为什么无法卸载U盘?如何用`lsof`或`fuser`解决? 4. 如何查看某个进程打开的所有网络连接?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值