centos6下解决光盘无法退出(lsof和fuser)

2024-03-11 10:58

本文主要是介绍centos6下解决光盘无法退出(lsof和fuser),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

    当您想退出光盘时须使用umout命令,否则光驱就会一直处于死锁状态,#umount /dev/sr0,或者直接退出光盘#eject。但当光盘正在被打开或者使用,使用上述命令都无法成功提示device is busy,这时就需要使用lsof或fuser命令了(不想了解命令参数的详细,可直接查看后面的退出光盘操作)。

二、详解

1、lsof命令

       lsof(list open files)是一个列出当前系统打开文件的工具,在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

(1)命令格式:

lsof [参数][文件]

(2)命令功能:

       用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。

      lsof打开的文件可以是:普通文件、目录、网络文件系统的文件、字符或设备文件、(函数)共享库、管道和命名管道、符号链接、网络文件(例如:NFS file、网络socket,unix域名socket),还有其它类型的文件等等。

(3)命令参数:

-a 列出打开文件存在的进程

-c<进程名> 列出指定进程所打开的文件

-g  列出GID号进程详情

-d<文件号> 列出占用该文件号的进程

+d<目录>  列出目录下被打开的文件

+D<目录>  递归列出目录下被打开的文件

-n<目录>  列出使用NFS的文件

-i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p<进程号> 列出指定进程号所打开的文件

-u  列出UID号进程详情

-h 显示帮助信息

-v 显示版本信息

(4)使用实例:

实例1:无任何参数

命令:#lsof

说明:

lsof输出各列信息的意义如下:

COMMAND:进程的名称

PID:进程标识符

PPID:父进程标识符(需要指定-R参数)

USER:进程所有者

PGID:进程所属组

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等

(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改

(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序

(3)lnn:library references (AIX);

(4)er:FD information error (see NAME column);

(5)jld:jail directory (FreeBSD);

(6)ltx:shared library text (code and data);

(7)mxx :hex memory-mapped type number xx.

(8)m86:DOS Merge mapped file;

(9)mem:memory-mapped file;

(10)mmap:memory-mapped device;

(11)pd:parent directory;

(12)rtd:root directory;

(13)tr:kernel trace file (OpenBSD);

(14)v86  VP/ix mapped file;

(15)0:表示标准输出

(16)1:表示标准输入

(17)2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等

(1)u:表示该文件被打开并处于读取/写入模式

(2)r:表示该文件被打开并处于只读模式

(3)w:表示该文件被打开并处于

(4)空格:表示该文件的状态模式为unknow,且没有锁定

(5)-:表示该文件的状态模式为unknow,且被锁定

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

(1)N:for a Solaris NFS lock of unknown type;

(2)r:for read lock on part of the file;

(3)R:for a read lock on the entire file;

(4)w:for a write lock on part of the file;(文件的部分写锁)

(5)W:for a write lock on the entire file;(整个文件的写锁)

(6)u:for a read and write lock of any length;

(7)U:for a lock of unknown type;

(8)x:for an SCO OpenServer Xenix lock on part      of the file;

(9)X:for an SCO OpenServer Xenix lock on the      entire file;

(10)space:if there is no lock.

TYPE:文件类型,如DIR、REG等,常见的文件类型

(1)DIR:表示目录

(2)CHR:表示字符类型

(3)BLK:块设备类型

(4)UNIX: UNIX 域套接字

(5)FIFO:先进先出 (FIFO) 队列

(6)IPv4:网际协议 (IP) 套接字

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

实例2:查看谁正在使用某个文件,也就是说查找某个文件相关的进程

命令:#lsof /bin/bash

输出:

[root@localhost ~]# lsof /bin/bash
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
bash    24159 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24909 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24941 root txt    REG    8,2 801528 5368780 /bin/bash

实例3:递归查看某个目录的文件信息

命令:#lsof +D /opt/soft/test/test3

输出:

[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# lsof +D /opt/soft/test/test3
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    24941 root  cwd    DIR    8,2 4096 2258872 test/test3
vi      24976 root  cwd    DIR    8,2 4096 2258872 test/test
说明: 使用了+D,对应目录下的所有子目录和文件都会被列出。

实例4:不使用+D选项,遍历查看某个目录的所有文件信息的方法

命令:# lsof |grep 'test/test3'

输出:

[root@localhost soft]# lsof |grep 'test/test3'
bash      24941 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root    4u      REG                8,2    12288    2258882 /opt/soft/test/test3/.log2013.log.swp

实例5:列出某个用户打开的文件信息

命令:#lsof -u username

说明: -u 选项,u其实是user的缩写。

实例6:列出某个程序进程所打开的文件信息

命令:#lsof -c mysql

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

实例7:列出多个进程多个打开的文件信息

命令:#lsof -c mysql -c apache

实例8:列出某个用户以及某个进程所打开的文件信息

命令:#lsof  -u test -c mysql 

说明:用户与进程可相关,也可以不相关。

实例9:列出除了某个用户外的被打开的文件信息

命令:#lsof -u ^root

说明:^这个符号在用户名之前,将会把是root用户打开的进程不让显示。

实例10:通过某个进程号显示该进行打开的文件

命令:#lsof -p 1

实例11:列出多个进程号对应的文件信息

命令:#lsof -p 1,2,3

实例12:列出除了某个进程号,其他进程号所打开的文件信息

命令:#lsof -p ^1

实例13:列出所有的网络连接

命令:#lsof -i

实例14:列出所有tcp 网络连接信息

命令:#lsof -i tcp

实例15:列出所有udp网络连接信息

命令:#lsof -i udp

实例16:列出谁在使用某个端口

命令:#lsof -i :3306

实例17:列出谁在使用某个特定的udp端口

命令:#lsof -i udp:55

或者:特定的tcp端口

命令:#lsof -i tcp:80

实例18:列出某个用户的所有活跃的网络端口

命令:#lsof -a -u test -i

实例19:列出所有网络文件系统

命令:#lsof -N

实例20:域名socket文件

命令:#lsof -u

实例21:某个用户组所打开的文件信息

命令:#lsof -g 5555

实例22:根据文件描述列出对应的文件信息

命令:#lsof -d description(like 2)

例如:lsof  -d  txt

例如:lsof  -d  1

例如:lsof  -d  2

说明:0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

实例23:根据文件描述范围列出文件信息

命令:#lsof -d 2-3

实例24:列出COMMAND列中包含字符串" sshd",且文件描符的类型为txt的文件信息

命令:#lsof -c sshd -a -d txt

[root@localhost soft]# lsof -c sshd -a -d txt
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
sshd     2756 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24155 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24905 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24937 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd

实例25:列出被进程号为1234的进程所打开的所有IPV4 network files 

命令:#lsof -i 4 -a -p 1234

实例26:列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令

命令:#lsof -i @peida.linux:20,21,22,25,53,80  -r  3

(5)退出光盘操作

首先查看光盘挂载信息:#df  -lh

文件系统	      容量  已用  可用 已用%% 挂载点
/dev/sda6             237G  134G   91G  60% /
tmpfs                 1.9G  288K  1.9G   1% /dev/shm
/dev/sr0              3.8G  3.8G     0 100% /media/centos6.5
然后使用#lsof /dev/sr0或者#lsof /media/centos6.5

COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash      5476 aoyang  cwd    DIR   11,0     2048 1792 /media/centos6.5
AutoSetup 5617 aoyang  cwd    DIR   11,0     2048 1792 /media/centos6.5
AutoSetup 5617 aoyang  txt    REG   11,0  7722726 1808 /media/centos6.5/AutoSetup
接着使用#kill -9 5476 5617

最后使用#umount /media/centos6.5或#eject即可卸载光盘。

2、fuser命令

       fuser用以由文件或设备去找出使用文件、或设备的进程,对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。umount光驱的时候,结果系统提示设备正在使用或者正忙,fuser便可进行查询和处理。
 (1)fuser 指令
(与manpage中#man fuser相对应)
用途:使用文件或文件结构识别进程。http://write.blog.csdn.net/postedit/42487987
语法:fuser [ -c | -d | -f ] [ -k ] [ -u ] [ -x ] [ -V ] 文件 ...
描述:

fuser displays the PIDs of processes using the specified filesor file systems. In the default display mode, each file name isfollowed by a letter denoting the type of access:
# 注释 :fuser 显示使用指定文件或者文件系统的进程的 pid ,默认会在每个 pid 后面加上一个字符表示访问的方式:
(显示信息的字符,区别于标志)
#     -)1、c:表示 current directory 。表示进程是在该目录下启动的。
#     -)2、e:表示是可执行的程序
#     -)3、f:打开文件。默认不显示
#     -)4、r:root 目录,表示该目录是该进程的 / 目录
#     -)5、m:表示 mmap 过的文件或者共享库
c:current directory.
e:executable being run.
f:open file. f is omitted in default display mode.
F:open file for writing. F is omitted in default displaymode.
r:root directory.
m:mmap'ed file or shared library.

fuser returns a non-zero return code if none of the specifiedfiles is accessed or in case of a fatal error. If at least oneaccess has been found, fuser returns zero.
# 注释 :如果指定文件没有任何进程访问,或者出现严重错误,fuser 返回非 0 的 exit status。
# 如果至少存在一个进程,则 fuser 返回 0

In order to look up processes using TCP and UDP sockets, thecorresponding name space has to be selected with the -n option. Bydefault fuser will look in both IPv6 and IPv4 sockets. To changethe default, behavior, use the -4 and -6 options. The socket(s) canbe specified by the local and remote port, and the remote address.All fields are optional, but commas in front of missing fields mustbe present:
# 注释:为了查找使用某个 TCP /UDP sockets 的进程,你必须用 -n 指定 (name space)tcp还是 udp 。
# 默认 fuser 会查找 ipv4 和 ipv6 sockets 。你可以使用 -4 或者 -6 来改变选项
# sockets 可以按照 local port:remote_host:remote_port的方式来指定。每个字段都是可选的,但不能省略 ','
[lcl_port][,[rmt_host][,[rmt_port]]]

Either symbolic or numeric values can be used for IP addressesand port numbers.
# 注释 ;在端口方面,你可以用端口名或者数字表示
fuser outputs only the PIDs to stdout, everything else is sentto stderr.
# 注释 :fuser 只输出 PID 到 stdout ,其他都送给 stderr

Options
-a
Show all files specified on the command line. By default, onlyfiles that are accessed by at least one process are shown.
# 注释 :-a 显示所有指定文件的情况,即使没有进程访问它们。
-c
Same as -m option, used for POSIX compatibility.
-f
Silently ignored, used for POSIX compatibility.
-k
Kill processes accessing the file. Unless changed with-signal, SIGKILL is sent. An fuser process never kills itself, butmay kill other fuser processes. The effective user ID of theprocess executing fuser is set to its real user ID beforeattempting to kill.
# 注释 :-k 表示杀死访问指定文件的进程。默认发送 SIGKILL(-9)信号。fuser 进程永远不会杀死自己。
# 但可能杀死其他 fuser 进程。在尝试杀死进程前,fuser 会改变 euid为 ruid
-i
Ask the user for confirmation before killing a process. Thisoption is silently ignored if -k is not present too.
# 注释 :-i 表示交互模式,在杀死进程前会提示。必须和 -k 合用
-l
List all known signal names.
# 注释 :-l 列出所有已知的信号
-m
name specifies a file on a mounted file system or a blockdevice that is mounted. All processes accessing files on that filesystem are listed. If a directory file is specified, it isautomatically changed to name/. to use any file system that mightbe mounted on that directory.
# 注释:-m 表示指定文件所在的文件系统或者块设备(处于 mount状态)。所有访问该文件系统的进程都被列出。
# 假如指定了一个目录,则自动在后面加上 '/'  表示该挂载在该目录上的文件系统
-n space
Select a different name space. The name spaces file (filenames, the default), udp (local UDP ports), and tcp (local TCPports) are supported. For ports, either the port number or thesymbolic name can be specified. If there is no ambiguity, theshortc     utnotation name/Ispace (e.g. 80/tcp ) can be used.
# 注释 :-n 指定 sockets 的协议类型。可以是file(默认)、udp、tcp 。
#你甚至可以使用'<port>/<proto>'的简写方式,只要不存在异义的话
-s
Silent operation. -u and -v are ignored in this mode. -a mustnot be used with -s.
# 注释 :-s 表示安静模式。-u 和 -v 会被忽略,-a 不能和 -s一起使用
-signal
Use the specified signal instead of SIGKILL when killingprocesses. Signals can be specified either by name (e.g. -HUP) orby number (e.g. -1). This option is silently ignored if the -koption is not used.
#注释:-<signal> 指定信号
-u
Append the user name of the process owner to each PID.
# 注释 :-u 表示在 PID 后面加上进程的 owner
-v
Verbose mode. Processes are shown in a ps-like style. Thefields PID, USER and COMMAND are similar to ps. ACCESS shows howthe process accesses the file. If the access is by the kernel (e.g.in the case of a mount point, a swap file, etc.), kernel is showninstead of the PID.
# 注释 :-v 表示 verbose 模式。进程以  ps 的方式显示,包括 PID、USER、COMMAND、ACCESS字段
# 如果是内核访问的(例如 mount point、swap 文件),则显示为kernel 而不是 pid
-V
Display version information.
-4
Search only for IPv4 sockets. This option must not be usedwith the -6 option and only has an effect with the tcp and udpnamespaces.
# 仅查询IPV4套接字
-6
Search only for IPv6 sockets. This option must not be usedwith the -4 option and only has an effect with the tcp and udpnamespaces.
#仅查询IPV6套接字
-
Reset all options and set the signal back to SIGKILL.
# 注释:‘-’ 表示重置所有选项并把信号设置为 SIGKILL

Files
/proc     location of the proc file system

Examples
fuser -km /home
kills all processes accessing the filesystem /home in any way.
# 注释 :fuser -km /home 杀死所有访问 /home文件系统的进程
if fuser -s /dev/ttyS1; then :; else something; fi
    invokes something if no other process isusing /dev/ttyS1.
fuser telnet/tcp
    shows all processes at the (local) TELNETport.

要列出使用 /etc/passwd 文件的本地进程的进程号,请输入:
fuser /etc/passwd要列出使用 /etc/filesystems 文件的进程的进程号和用户登录名,请输入:
fuser -u /etc/filesystems要终止使用给定文件系统的所有进程,请输入:
fuser -k -x -u -c /dev/hd1 或者
fuser -kxuc /home任一命令都列出了进程号和用户名,然后终止每个正在使用 /dev/hd1 (/home) 文件系统的进程。仅有 root 用户能终止属于另一用户的进程。如果您正在试图卸下 /dev/hd1 文件系统,而一个正在访问 /dev/hd1 文件系统的进程不允许这样,您可能希望使用此命令。
要列出正在使用已从给定文件系统删除的文件的全部进程,请输入:
fuser -d /usr文件
/dev/kmem 用于系统映像。
/dev/mem 也用于系统映像。
# fuser -vm /usr/local/
   USER      PID ACCESS COMMAND
/usr/local/:       daemon    5227 F..e. httpdroot      8332 F..e.httpdroot     14402 f.c..mysqld_safemysql    14502 F.ce. mysqlddaemon   14611 F..e. httpddaemon   27591 F..e. httpddaemon   27619 F..e. httpd
在使用fuser -km 就可以杀死进程,同时也可以使用交互式的-i参数,一个一个杀死。
(2)退出光盘操作
首先查看光盘挂载信息:#df  -lh
然后使用#fuser -km /media/centos6.5或fuser -km /dev/sr0

最后使用#umount /media/centos6.5或#eject即可卸载光盘。

三、总结

(1)lsof和fuser对卸载光盘过程中的操作虽然简单,但是详细的参数也得了解。

(2)其他方面的应用暂时没有很深的接触,以后再加以总结。

这篇关于centos6下解决光盘无法退出(lsof和fuser)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797616

相关文章

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

centos6一键安装vsftpd脚本

centos6一键安装vsftpd脚本 手动安装vsftpd参考教程:Centos下安装Vsftpd的图文教程 vsftpd脚本功能: 1.安装 (命令执行:sh xxx.sh)2.添加ftp用户 (命令执行:sh xxx.sh add)3.卸载vsftpd (命令执行:sh xxx.sh uninstall) 测试环境:centos6 x64 centos6 x86(测试centos7以

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。