Linux入门之进程管理(4)之进程与文件

Linux入门之进程管理(4)之进程与文件

前面使用进程相关命令管理工具都是根据进程编号或者进程名称及其其它属性信息来查看和处理相关进程的,但是在某些情况下,想要查看某个文件或者某个设备被哪些进程所使用,使用ps、pgrep等命令查询的是不够准确的,而且有些时候并不是简单的去打开某个文本文件一样,这样还可以进行搜索过滤出来。而在linux系统中,除了常见的配置文件、日志文件等文本文件,几乎任何对象都会被内核映射去该有的文件,比如磁盘设备、挂载点等。当要知道那些用户通过哪些进程来在访问或者使用此文件时,就需要通过向文件的方式去查找其来链接的进程了。

linux软件包中也提供了一些相关命令来解决:fuser lsof

fuser  命令

fuser - identify processes using files or sockets

通过文件或者套接字文件来识别器对应的进程

选项与参数:

fuser  [-umv] [-k [i] [signal]] file/dir

-u:除了进程的PID之外,同时列出该进程的拥有者;

-m:后面接的那个文件名会主动的上提到该文件系统的最顶层,对于umount不成功很有效

-v:可以列出每个文件与进程还有指令的完整相关性;

-k:找出该文件/目录的PID,并对与其PID对应的进程发送SIGKILL信号;

-i:必须与 -k 配合,在删除PID 之前会先询问使用者,交互式;

-signal:例如 -l -15 指定信号代码,不指定默认为SIGKILL(-9)信号。

使用案例:

1、显示信息字段介绍

#找出对当前所在目录的进行使用的进程的PID、所属用户、权限

[[email protected] ~]# fuser -uv .
                  USER       PID ACCESS COMMAND
/root:               root      13357 ..c.. (root)bash
                  root      14154 ..c.. (root)bash

解析:这里当前目录在root家目录,有两个PID也就是两个进程号分别为13357、14154的进程在访问此目录,此进程所属用户为root,并且进程指令为bash。在ACCESS访问的那一列有很多字符,下面一一介绍:

ACCESS:

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 display mode.

#该文件被开启,但是在等待回应中

r    root directory.          #代表顶级目录(root directory)

m    mmap‘ed file or shared library.  #可能为分享的动态函数库

2、指定目录或文件访问进程列表查看

查看某个文件系统下有多少个进程正在占用该文件,使用-m选项指定挂载点

#开启另一个终端bash进程来备份当前关盘镜像

[[email protected] ~]# dd if=/dev/cdrom of=/test/mk.iso

#回到刚才终端查看/dev/cdrom设备

[[email protected] ~]# fuser -uv /dev/cdrom 
                USER        PID ACCESS COMMAND
/dev/sr0:            root      14756 f.... (root)dd

说明:f表示是一个被开启的文件,因为要读取光盘数据,肯定是会打开访问的。

#查看/proc虚拟文件系统挂载点又多少进程在访问

[[email protected] ~]# fuser -muv /proc/  
                  USER           PID ACCESS COMMAND
/proc:               root           kernel mount (root)/proc
                  root          1 f.... (root)systemd
                  root          2 ...e. (root)kthreadd
                  root          3 ...e. (root)ksoftirqd/0
                  root          5 ...e. (root)kworker/0:0H
                  root          7 ...e. (root)migration/0
                  root          8 ...e. (root)rcu_bh
                  root          9 ...e. (root)rcuob/0

3、查看指定目录访问用户及进程

查看所有使用到/home这个文件系统的进程

#使用另一个终端用hadoop并切换到用户家目录

[[email protected] ~]# su - hadoop
[[email protected] ~]$ whoami
hadoop
[[email protected] ~]$ pwd
/home/hadoop

#查看当前所在的bash进程

[[email protected] ~]$ echo $$
14803

#使用fuser 命令查询出/home下访问的进程指令及用户和PID

[[email protected] ~]$ fuser -muv ..
                     USER        PID ACCESS COMMAND
/home:               root     kernel mount (root)/
                     hadoop    14803 .rce. (hadoop)bash

解析:这里显示了当前hadoop开启的PID为14803的bash进程,下面用pidof来确认。

#使用pidof确认当前所在会话进程

[[email protected] ~]$ pidof -s bash
14803

说明:这里的进程的发起者为hadoop和其访问目录,/home本身为/目录的目录,rce则表示此当前已经在此目录中,并且正在打开使用中,因为hadoop在/home/hadoop下,当然已经进入了,且为顶级目录。

4、挂载点目录的强制卸载

当有时候因为有内存中大量的数据尚未写入到文件系统的挂载点中,但是又想要卸载此挂载点,这时就可以用到-k和-m选项来指导挂载点并强制停止挂载点的使用。

#查询新建的/dev/sda3分区的挂载点为/test目录

[[email protected] ~]# findmnt /dev/sda3
TARGET SOURCE    FSTYPE OPTIONS
/test  /dev/sda3 ext4   rw,relatime,seclabel,data=ordered

#下面对此目录进行大连读写操作

[[email protected] ~]# tar -jcf  /test/iso.bak  /mnt/Packages/* &

#确定此进程仍在后台运行

[[email protected] ~]# jobs
[1]+  Running                 tar -jcf /test/iso.bak /mnt/Packages/* &

#使用umount卸载/test挂载点

[[email protected] ~]# umount /test/
umount: /test: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

说明:这里闲了了target is busy表示此挂载点目录正在被使用中,所以无法卸载,在以往可以使用pkill、pgrep等命令来查看tar相关进程并进行kill -9来强制杀掉此进程,但是如果使用pkill或者pgrep的-f选项来完整过滤命令行是很难精确匹配的,如果在多个终端上都有此访问,可能会误杀。

#因此使用fuser直接找到对应的文件目录的进程PID

[[email protected] ~]# fuser -muv /test/
                     USER        PID ACCESS COMMAND
/test:               root     kernel mount (root)/test
                     root      14877 F.... (root)bzip2

说明:这里显示了F说明此目录并每人进入范围而是后台对其操作。并且显示的确定命令居然显示不是tar命令,而是bzip2命令,这就更好解释了,因为tar -j命令就是调用bzip2命令进行对归档文件的压缩。对此可以判断通过这里可以看到最直接的命令调用。

#使用-k默认发送-9信号,-m将/test目录排队到文件系统映射的最前面,这样杀死对目录有访问有关的所有进程都会杀死。

[[email protected] ~]# fuser -km /test
/test:               14877

#再次查看/test目录下的进程,只有最基本的系统内核的文件系统了

[[email protected] ~]# fuser -muv /test/
                     USER        PID ACCESS COMMAND
/test:               root     kernel mount (root)/test

#下面直接卸载,没有提示错误或警告

[[email protected] ~]# umount /test

#再次查看当前挂载点中,通过与运算符判断输出,已经被卸载掉了

[[email protected] ~]# mount | grep ‘\</test/\>‘ && echo ‘mountpoint such‘ || echo ‘mountpoint no such‘
mountpoint no such

lsof  命令

lsof - list open files

与fuser查看文件的相关进程信息相反,此命令是通过进程来列出对应进程所在使用的文件。

选项与参数:

lsof  [-aUn]  [+d]

-a:多项数据需要同时成立才显示出结果,类似find中-a的作用;

-U:仅列出unix like 相关的 socket  文件类型;

-uuname:列出指定进程的生效者所开启的文件;

+ddirpath:找出指定目录下已经被开启的文件;

使用案例:

#列出当前系统上面所有被开启的文件

[[email protected] ~]# lsof

说明:这里的信息与ps直接列出的信息有些相识,只是CMMADN列为直接调用的命令名,而

NAME则表示了被开启的文件的完整路径。DEVICE列还显示了对应的文件所在文件系统的主设备号和此设备号。USER显示了使用的用户,TYPE显示了此文件的类型。还有NODE此列表示文件对应的indoe编号。

#累出关于root的所有进程开启的socket文件

[[email protected] ~]# lsof -u root -a -U

解析:因为套接字为进程间通信时临时产生,所有为内存中的临时文件,这里的DEVICE表示了每个套接字文件对应的其唯一的标识符号。

#列出所有系统上列出的被启动的周边装载

[[email protected] ~]# lsof +d /dev

#配合grep过滤出只属于root用户咋在bash进程所开启的文件

[[email protected] ~]# lsof -u root | grep ‘\<bash\>‘

时间: 2024-11-28 23:09:44

Linux入门之进程管理(4)之进程与文件的相关文章

Linux入门之磁盘管理(2)文件系统

Linux入门之磁盘管理(2)文件系统 linux分区构成完成之后,一般需要进行对其创建指定的文件系统,也就是我们常说的格式化,然后对其进行分区挂载,提供指定分区的访问点.不同的分区格式会在文件系统内部提供不同的对该分区的数据存储的格式分配,以及其内部模块会支持不同的分区的接口及方法调用,例如对一个文件的打开.读取.写入.关闭等功能,每个文件系统都会有各种不同的特点. 常见的系统文件系统: linux: ext2.ext3.ext4:xfs(SGI):btrfs(Oracle):reiserfs

Linux入门之内核管理番外篇(4)udev入门(1)

Linux入门之内核管理番外篇(4)udev入门(1) 前言 在上篇中的内核模块管理讲解中,最后或多或少会留下一些疑问,那么这些疑问就是内核模块的参数是怎么和对应的硬件所匹配上的,而硬件又是怎么被内核识别,并且一个个都映射成实际存在的文件,而这些文件之间的关系及作用.当然在最后了解到,这些硬件设备的探测信息是通过一个叫udev的工具来实现的,通过udev中配置的规则可以很有效的识别每一个硬件,并配合sysfs文件系统,将每个探测到的硬件信息导入到/sys目录中,那么与/proc目录对与内核系统信

Linux入门之磁盘管理(1)分区管理

Linux入门之磁盘管理(1)分区管理 无论是windows还是linux,目前支持的分区结构只有两种,一种是基于blos检查启动的mbr结构,另一种是基于uefi(统一扩展固件接口)的opt分区结构.当然,目前广泛的还是使用的mbr结构. linux中有很多不同的文件系统,当使用安装光盘安装的readhat类的linux系统默认一般支持的主要格式为ext类(ext2.ext3.ext4),当然这些是redhat或者centos5.6所使用的默认设备,且安装centos7时默认使用的分区格式为x

Linux入门之磁盘管理(9)LVM逻辑卷案例

Linux入门之磁盘管理(9)LVM逻辑卷案例 案例介绍阶段(1): 创建一个由两个物理卷组成的大小未20G的卷组myvg,要求其PE大小为16M:而在此卷组中创建一个大小未5G的逻辑卷lvtest,此逻辑卷要能在开机后自动挂载至/mnt/lvtest目录,且支持ACL功能. 1.准备工作 #这里我们分别从两个磁盘选择10G来准备组合为PV [[email protected] ~]# fdisk -l | grep -o '/.*B' /dev/sda: 21.5 GB /dev/sdb: 2

Linux进程管理(第二版) --进程管理命令

进程管理命令 一.查看用户信息w 1. w显示信息的含义 TTY:说明用户登录的方式,ttyN:表示以本地终端登录;pts/N表示以远程终端登录 JCPU:以终端代号来区分,该终端所有相关的进程执行时,所消耗的CPU时间会显示在这里 PCPU:CPU执行程序耗费的时间 WHAT:用户正在执行的操作 load average:分别显示系统在过去1.5.15 分钟内的系统的平均负载程度[一般在0.8之下,我们认为系统负载较轻] FROM:显示用户从何处登录系统,":0"的显示代表该用户时从

【归纳总结】Unix/linux下的进程管理(二):创建进程的函数及其应用、对比

创建进程的函数fork().vfork()和execl() 本次内容主要介绍Unix/linux下2个创建进程的函数fork和vfork以及它们的差别. 1.fork函数 (1)函数的格式 #include <unistd.h> pid_t fork(void); 函数功能: 主要用于以复制正在运行进程的方式来创建新的进程,其中新进程叫做子进程,正在运行的进程叫做父进程. 返回值: 函数调用成功时,父进程返回子进程的PID,子进程返回0,函数调用出错时,父进程返回-1,子进程没有被创建. 注意

linux进程管理之轻量级进程(四)

在Linux中,轻量级进程可以是进程,也可以是线程.我们所说的线程,在Linux中,其实是轻量级进程之间共享代码段,文件描述符,信号处理,全局变量时: 如果不共享,就是我们所说的进程. 进程是资源管理的最小单位,线程是程序执行的最小单位.在操作系统设计上,从进程演化出线程,最主要的目的就是减小多进程上下文切换开销. 最初的进程定义都包含程序.资源及其执行三部分,其中程序通常指代码,资源在操作系统层面上通常包括内存资源.IO资源.信号处理等部分, 而程序的执行通常理解为执行上下文,包括对CPU的占

windowsf进程管理器中进程解释

(1)[system Idle Process] 进程文件: [system process] or [system process] 进程名称: Windows内存处理系统进程 描 述: Windows页面内存管理进程,拥有0级优先. 介 绍:该进程作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间.它的cpu占用率越大表示可供分配的CPU资源越多,数字越小则表示CPU资源紧张. (2)[alg.exe] 进程文件: alg or alg.exe 进程名称: 应用层网关

UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这种信号的系统默认动作是忽略它. 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函数来获取终止子进程的终止状态.那么,有几个问题我们这里需要详细的学习一下. 1. 父进程一定能够获取到子进程的终止状态吗?如果子进程在父进程调用 wait 函数前就终止了,怎么办? 2. 如果父进程没有获