>

访问类型如下sbf282.com:,用来管理运行程序的标

- 编辑:澳门博发娱乐官网 -

访问类型如下sbf282.com:,用来管理运行程序的标

kill

    在Windows系统中,当某个一个程序出现假死或无反应时,我们常常打开任务管理器,找到对应的进程,然后杀掉该进程。在命令行盛行的Linux中,我们该使用哪个命令?常用于杀掉进程的命令非kill莫属了。

FUSER

fuser功能
fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.

fuser显示使用指定文件或者文件系统的进程ID.默认情况下每个文件名后面跟一个字母表示访问类型。

访问类型如下:
c 代表当前目录
e 将此文件作为程序的可执行对象使用

f 打开的文件。默认不显示。
F 打开的文件,用于写操作。默认不显示。

r 根目录。
m 映射文件或者共享库。

s 将此文件作为共享库(或其他可装载对象)使用
当指定的文件没有被访问,或者出现错误的时候,fuser会返回非零。
为了查看使用tcp和udp套接字的进程,需要-n选项并指定名称空间。默认IpV4和IpV6都会显示。套接字可以是本地的或者是远程的端口,和远程的地址。所有的域是可选的,但是其前面的','必须存在。如下:
[lcl_port][,[rmt_host][,[rmt_port]]]
对于ip地址和port,名称和数字表示都可以使用。
fuser只把PID输出到标准输出,其他的都输出到标准错误输出。
常用选项
-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。
-c 和-m一样,用于POSIX兼容。
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。
-l 列出所有已知的信号名称。
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口, 可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。
-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。
-u 在每个PID后面添加进程拥有者的用户名称。
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel. -V 输出版本号。
-4 使用IPV4套接字,不能和-6一起应用,只在-n的tcp和udp的命名存在时不被忽略。
-6 使用IPV6套接字,不能和-4一起应用,只在-n的tcp和udp的命名存在时不被忽略。

  • 重置所有的选项,把信号设置为SIGKILL. 

使用示例

显示使用某个文件的进程信息
$ fuser -um /dev/sda2
/dev/sda2: 6378c(quietheart) 6534c(quietheart) 6628(quietheart)
6653c(quietheart) 7429c(quietheart) 7549c(quietheart) 7608c(quietheart)
这个命令在umount的时候很有用,可以找到还有哪些用到这个设备了。

杀掉打开readme文件的程序

$fuser -m -k -i readme
这里,会在kill之前询问是否确定。最好加上-v以便知道将要杀那个进程。

查看那些程序使用tcp的80端口
$fuser -v -n tcp 80

$fuser -v 80/tcp
fuser不同信号的应用
用 -l参数可以列出fuser所知的信号
# fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL,例如:只是挂起进程,那么发送HUP信号就可以了
# fuser -v /root/install.log
用户 进程号 权限 命令
/root/install.log: root 3347 f.... tail
# fuser -k -SIGHUP /root/install.log
/root/install.log: 3347
# fuser -v /root/install.log

一,为什么要使用fuser?
   先说 fuser的作用,
   fuser能识别出正在对某个文件或端口访问的进程
   大家想一下,还有哪个命令具备这个功能?
   没错,是lsof,
   我们前面讲过, lsof能够找出正在对指定文件访问的进程,
   那么它们两者之间有何区别?
   fuser有一个特别的用法在于它可以一次杀死那些正在访问指定文件的进程    

二,如何使用fuser?
 
   1,如何用fuser得到正在使用指定文件的进程?
     用法: fuser 文件
     说明:它会把正在使用当前文件的进程id列出

     [root@localhost lhd]# umount /
     umount: /: device is busy.
           (In some cases useful info about processes that use
            the device is found by lsof(8) or fuser(1))
     [root@localhost lhd]# fuser /
      /:                       1rc     2rc     3rc     4rc     5rc     6rc     7rc    80rc    82rc    84rc    85rc   153rc   157rc   158rc

                               160rc   165rc   168rc  203rc   204rc   205rc   253rc   441rc   444rc   516rc   521rc   524rc   582rc   583rc

                               584rc   633rc  1052rc  1392rc  1394rc  1417rc  1597rc  1609rc  1617rc  1620rc  1683rc  1744rc  1783r  1785rc

                               1788rc  1806r  1808r  1810rc  1811rc  1812rc  1813rc  1814rc  1815rc  1848rc  1886rc  1899rc  1900rc  2001rc

                               ......太多不一一列出

      说明:
      这些进程号后面的rc是什么意思?
     
      c 将此文件作为当前目录使用。
      e 将此文件作为程序的可执行对象使用。
      r 将此文件作为根目录使用。
      s 将此文件作为共享库(或其他可装载对象)使用

   2,如何列出进程的详细信息,而不仅仅是进程id?
     用 -v参数即可
     说明: -v:  含义是:verbose output,详细的输出信息
     例子:

     [root@dev ~]# fuser /var/log
     /var/log:             4196c
     [root@dev ~]# fuser -v /var/log      

                          USER        PID ACCESS COMMAND
     /var/log:            root       4196 ..c.. bash

    3,如何列出进程所属的用户?
     用 -u参数即可
     说明: -u: 含义:display user IDs,显示用户id
    
     例子:
     [root@dev ~]# fuser -u /var/log
     /var/log:             4196c(root)
     说明: -n: 含义:获得正在访问某一端口的进程号,然后可以用kill命令杀死。

     [root@dev ~]# fuser -un tcp 25
      25/tcp:             4196(root)
     4,如何杀死所有正在访问指定文件的进程?
     用 -k参数即可
     说明: -k:含义: kill processes accessing the named file

     例子:

     [root@localhost lhd]# fuser -v /root/install.log

                          用户     进程号 权限   命令
     /root/install.log:   root       3185 f.... tail
     [root@localhost lhd]# fuser -k /root/install.log
     /root/install.log:    3185
     [root@localhost lhd]# fuser -v /root/install.log

     说明: -k参数能够杀死所有的正在访问指定文件的进程,所以用来杀进程时非常方便
     说明之二: fuser如何杀死的进程?
             它发送的是这个信号:SIGKILL

三,多学一点知识

    1,fuser可以列出它所知的信号:
     用 -l参数即可
    
     例子:
     [root@dev ~]# fuser -l
     HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
     STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
     UNUSED

    2,fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL
      例如:只是挂起进程,那么发送HUP信号就可以了
    
      例子:
      [root@localhost lhd]# fuser -v /root/install.log

                           用户     进程号 权限   命令
      /root/install.log:   root       3347 f.... tail
      [root@localhost lhd]# fuser -k -SIGHUP /root/install.log
      /root/install.log:    3347
      [root@localhost lhd]# fuser -v /root/install.log

二、 进程的监控与管理
Linux下,监控和管理进程的命令有很多,下面我们以ps、top、pstree、lsof四个最常用的指令介绍如果有效的监控和管理linux下的各种进程。

 

linux umount 提示"device is busy" 终极解决

基本用法

fuser [选项] [文件名]

其常用选项如下所示:

选项 说明
-a ,--all 显示命令行中指定的所有文件
-c 同-m选项,用于兼容POSIX
-k, --kill 杀掉使用文件的进程
-i, --interactive 杀掉进程前需要用户确认,如果无-k参数则默认忽略该参数
-l, --list-signals 显示所有已知的 signal名称
-m NAME, --mount NAME 指定一个挂载的文件系统或被挂载的设备
-n SPACE 指定一个不同的命名空间,支持不同的命名空间文件(默认为文件名)、UDP(本地UDP端口)、TCP(本地TCP端口),为避免歧义,可以使用name/space形式,如80/tcp
-w 仅杀掉拥有写入权限的进程,如果无-k参数则默认忽略该参数
-s, --silent 静默模式,-u和-v忽略该参数
-u, --user 在PID后显示所属的用户名
-v, --verbose 显示详细信息
-4, --ipv4 仅搜索IPv4的套接字
-6, --ipv6 仅搜索IPv6的套接字

fuser显示指定文件或文件系统的进程PID,在默认模式中,每个文件名后面会用一个字母表示访问类型,如下所示:

  • c:表示当前目录
  • e:表示该文件为可执行文件
  • f:表示被打开的文件,默认模式中f不显示
  • F:表示被打开的文件,用于写入操作,默认模式中F不显示
  • r:根目录
  • m:映射文件或共享lib
-f 和 -F 只有与选项 -v 一起使用的时候才会显示,其他情况则默认不显示

LSOF

lsof 拥有更多的功能
# lsof -i 看系统中有哪些开放的端口,哪些进程、用户在使用它们,比 netstat -lptu 的输出详细。

# lsof -i 4  查看IPv4类型的进程
COMMAND    PID        USER   FD   TYPE DEVICE SIZE NODE NAME
exim4     2213 Debian-exim    4u  IPv4   4844       TCP *:smtp (LISTEN)
dhclient3 2306        root    4u  IPv4   4555       UDP *:bootpc

# lsof -i 6  查看IPv6类型的进程
COMMAND  PID        USER   FD   TYPE DEVICE SIZE NODE NAME
exim4   2213 Debian-exim    3u  IPv6   4820       TCP *:smtp (LISTEN)

# lsof -i @192.168.1.2  查看与某个具体的IP相关联的进程
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
amule   3620 root   16u  IPv4  11925       TCP 192.168.1.2:42556->77.247.178.244:4242 (ESTABLISHED)
amule   3620 root   28u  IPv4  11952       TCP 192.168.1.2:49915->118-166-47-24.dynamic.hinet.net:5140 (ESTABLISHED)

# lsof -p 5670 查看PID为5670的进程打开的文件。

、进程的概念和分类 1.进程的概念 Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用同一个linux系统;多...

ps aux
%CPU 进程的cpu占用率
%MEM 进程的内存占用率
VSZ 进程所使用的虚存的大小(Virtual Size)
RSS 进程使用的驻留集大小或者是实际内存的大小,单位 KB。

fuser 命令的输出指出正在使用指定挂载点的进程的 PID。每个 PID 后面有一个字母,它表示与 PID 相关联的进程以什么方式使用指定的挂载点。最常见的字母是前面示例所示的 c,这表示指定的进程使用此文件系统上的一个目录作为当前工作目录。

基本用法

ps [选项]

其常用选项如下所示:

选项 说明
-A 显示所有进程,同选项-e
-a 显示所有进程,但排除新会话的首进程和无控制终端的进程
-d 显示所有进程,但排除新会话的首进程
-e 显示所有进程,同选项-A
r 仅显示正在运行的进程
-C cmdlist 显示指定命令的进程信息
-p pidlist 显示指定PID的进程
-t ttylist 显示指定tty的进程
-u userlist 显示指定有效用户ID或名字的进程
-c 显示CLS和PRI列
-f 添加详细列信息,通常与其他选项联合使用
-x 没有关联到终端上的进程也进行显示
-o 仅显示自定义的列
-l 仅显示属于当前登录用户的PID与相关信息列表
--sort spec 对输出信息进行排序 + 升序排序 - 降序排序

2.1 利用ps命令监控系统进程
ps是linux下最常用的进程监控命令,关于ps命令的语法和使用选项,我们在第四章已经有了详细的讲解,这里重点讲述如何利用ps指令监控和管理系统进程。
请看下面的示例:
下面是apache进程的输出信息
[[email protected] ~]#ps -ef | grep httpd
UID PID PPID C STIME TTY TIME CMD
nobody 7272 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7274 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7400 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7508 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7513 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7515 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 11998 26037 0 11:14 ? 00:00:00 /apache2/bin/httpd -k start
nobody 12941 26037 0 16:25 ? 00:00:00 /apache2/bin/httpd -k start
nobody 12979 26037 0 16:44 ? 00:00:00 /apache2/bin/httpd -k start
root 26037 1 0 Oct23 ? 00:00:00 /apache2/bin/httpd -k start
其中,UID是用户的ID标识号,PID是进程的标识号,PPID表示父进程,STIME表示进程的启动时间,TTY表示进程所属的终端控制台,TIME表示进程启动后累计使用的CPU总时间,CMD表示正在执行的命令。
从中可以清楚的看出,父进程和子进程的对应关系, PPID为26037的所有进程均为子进程,而PID为26037的进程是所有子进程的父进程,子进程由nobody用户启动,而父进程由root用户启动,父进程对应的PPID为1,即父进程同时为init进程的子进程。
其实也可以通过下面的指令方式查看子进程与父进程的对应关系,请看如下操作:
[[email protected] ~]# ps auxf | grep httpd
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 26037 0.0 0.1 6316 2884 ? Ss Oct23 0:00 /apache2/bin/httpd -k start
nobody 7272 0.0 0.1 7016 3740 ? S Nov06 0:00 _ /apache2/bin/httpd -k start
nobody 7274 0.0 0.1 7016 3704 ? S Nov06 0:00 _ /apache2/bin/httpd -k start
nobody 7400 0.0 0.1 7012 3676 ? S Nov06 0:00 _ /apache2/bin/httpd -k start
nobody 7508 0.0 0.1 7012 3732 ? S 00:09 0:00 _ /apache2/bin/httpd -k start
nobody 7513 0.0 0.1 7012 3700 ? S 00:09 0:00 _ /apache2/bin/httpd -k start
nobody 12979 0.0 0.1 7016 3684 ? S 16:44 0:00 _ /apache2/bin/httpd -k start
nobody 12980 0.0 0.1 7012 3652 ? S 16:44 0:00 _ /apache2/bin/httpd -k start
nobody 12982 0.0 0.1 7016 3664 ? S 16:44 0:00 _ /apache2/bin/httpd -k start
nobody 22664 0.0 0.1 6880 3540 ? S 22:24 0:00 _ /apache2/bin/httpd -k start
其中,%CPU表示进程占用的CPU百分比,%MEM表示进程占用内存的百分比,VSZ表示进程虚拟大小,RSS表示进程的实际内存(驻留集)大小(单位是页)。STAT表示进程的状态,进程的状态有很多种:用“R”表示正在运行中的进程,用“S”表示处于休眠状态的进程,用“Z”表示僵死进程,用“<”表示优先级高的进程,用“N”表示优先级较低的进程,用“s”表示父进程,用“+”表示位于后台的进程。START表示启动进程的时间。
这个例子将进程之间的关系用树形结构形象的表示出来,可以很清楚的看到,第一个进程为父进程,而其它进程均为子进程。同时从这个输出还可以看到每个进程占用CPU、内存的百分比,还有进程所处的状态等等。

 

在系统关闭过程中,会自动地卸载文件系统,这通常在终止所有非系统进程之后进行。但是,卸载文件系统仍然可能失败并显示以下消息:

pidof

    我们知道每个小孩一出生就会一个全国唯一的编号来对其进行标识,用于以后上学,办社保等,就是我们的身份证号。那么在Linux系统中,用来管理运行程序的标识叫做PID,就是大家熟知的进程ID。那么如何来找到程序的PID了,那么就需要用到命令pidof,其功能主要用来查看运行程序的PID。

lsof -i 通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息。
使用语法为:
lsof -i [46] [protocol][@hostname][:service|port]
46:4代表IPv4,6代表IPv6。
protocol:传输协议,可以是TCP或UDP。
hostname:主机名称或者IP地址。
service:进程的服务名,例如nfs、ssh、ftp等。
port:系统中服务对应的端口号。例如http服务默认对应80,ssh服务默认对应22等等。
例如:
显示系统中tcp协议对应的25端口进程信息:
[[email protected] ~]# lsof -i tcp:25
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sendmail 2252 root 4u IPv4 5874 TCP localhost:smtp (LISTEN)
显示系统中80端口对应的进程信息:
[[email protected] ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 16474 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
httpd 16475 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
httpd 16578 nobody 3u IPv6 7316069 TCP *:http (LISTEN)
显示本机udp协议对应的53端口开启的进程信息:
[[email protected] ~]# lsof [email protected]:53
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
named 21322 named 20u IPv4 9130640 UDP localhost:domain
通过lsof命令能够清楚的了解进程和文件以及程序之间的对应关系,熟练掌握lsof的使用,对linux的进程管理有很大帮助。

 

有时候,为了应对一些紧急情况或者删除挂载的 CD-ROM 或 DVD 等设备,Linux 或 UNIX 系统管理员需要卸载分区。在由于设备忙系统不允许删除它的情况下,检查系统上的所有进程是一个很烦人、很缓慢的过程。lsof 和 fuser 命令有助于识别阻止文件系统卸载的进程。如果情况非常紧急,fuser 命令甚至可以替您终止它们。

用法示例

1、杀掉所有占用/home的进程

[root@localhost ~]# fuser -km /home

2、显示本地所有mysql上端口进程

[root@localhost ~]# fuser mysql/tcp
mysql/tcp:            2680

3、显示详细的信息

[root@localhost ~]# fuser -v top.txt
                     用户     进程号  权限   命令
/root/top.txt:       root     15847 F....  top

4、查看有多个进程正在使用某个目录下文件系统,包含子目录

[root@localhost ~]# fuser -v -m /home/data
                     用户     进程号 权限   命令
/home/data:          root     kernel mount /home/data

5、通过端口定位进程

[root@localhost ~]# fuser -v -n tcp 22
                     用户     进程号 权限   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd
或
[root@localhost ~]# fuser -v 22/tcp
                     用户     进程号 权限   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd

2.3 利用top监控系统进程
top命令是监控系统进程必不可少的工具,与ps命令相比,top命令动态、实时的显示进程状态,而ps只能显示进程某一时刻的信息,同时,top命令提供了一个交互界面,用户可以根据需要,人性化的定制自己的输出,更清楚的了解进程的实时状态。
关于top指令的用法,在第四章已经有了详细的介绍,这里通过几个例子,阐述一下top命令在系统进程监控中的作用和优点。
下面这个例子是某系统在某时刻执行top命令后的输出:
[[email protected] ~]# top
Tasks: 126 total, 1 running, 123 sleeping, 1 stopped, 1 zombie
Cpu(s): 0.8% us, 0.1% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 8306544k total, 8200452k used, 106092k free, 234340k buffers
Swap: 8385888k total, 160k used, 8385728k free, 7348560k cached

vmstat

但是,假设 lsof 命令的输出像下面这样。

fuser

    fuser主要用于显示进程正在使用的文件、套接字、挂载点等。

3.进程的属性
(1)进程的几种状态
进程在启动后,不一定马上开始运行,因而进程存在很多种状态。
可运行状态:处于这种状态的进程,要么正在运行、要么正准备运行。
可中断的等待状态:这类进程处于阻塞状态,一旦达到某种条件,就会变为运行态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行态。
不中断的等待状态:与“可中断的等待状态”含义基本类似,唯一不同的是处于这个状态的进程对信号不做响应。
僵死状态:也就是僵死进程,每个进程在结束后都会处于僵死状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。
暂停状态:表明此时的进程暂时停止,来接收某种特殊处理,
(2)进程之间的关系
在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。
下面是通过ps命令输出的sendmail进程信息:
[[email protected] ~]# ps -ef|grep sendmail
UID PID PPID C STIME TTY TIME CMD
root 3614 1 0 Oct23 ? 00:00:00 sendmail: accepting connections
相对于父进程,就存在子进程,一般每个进程都必须有一个父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但是子进程关闭,父进程不一定终止。
如果父进程在子进程退出之前就退出,那么所有子进程就变成的一个孤儿进程,如果没有相应的处理机制的话,这些孤儿进程就会一直处于僵死状态,资源无法释放,此时解决的办法是在启动的进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。

 

所有计算机操作系统都在引导时检查它们挂载的文件系统是否是一致的,也就是说,确认它们的内部数据结构和映射到的相关存储没有错误。UNIX、Linux 和其他类 UNIX 操作系统采用一种聪明的方法检查文件系统的一致性(通常使用 fast 命令)。当这些系统挂载文件系统时,它们在文件系统头中设置一个值,把文件系统标为 DIRTY,这意味着它正在使用,在向它写入更新时可能暂时处于不一致的状态。在系统关闭期间卸载文件系统时,把它们标为 CLEAN。在重新引导系统时,只需要检查仍然标为 DIRTY 的文件系统的一致性。

基本语法

pstree [选项]

常用选项如下所示:

选项 说明
-a 显示每个进程的完整指令,包括路径、参数等
-h 高亮显示当前进程及父进程
-g 显示PGID
-n 相同父进程下,按各自的PID进行排序
-p 显示PID
-s 显示父进程
-u username 显示UID信息

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21115 root 23 0 1236m 360m 2384 S 6 4.4 382:24.14 java
30295 root 16 0 3552 984 760 R 1 0.0 0:00.09 top
30118 nobody 15 0 6904 3132 1676 S 0 0.0 0:00.47 httpd
30250 nobody 15 0 6900 3088 1660 S 0 0.0 0:00.06 httpd
1 root 16 0 1780 552 472 S 0 0.0 0:01.25 init
从top命令的输出可知,此系统有java和httpd两个用户进程在运行。
进程PID为21115的java进程由root用户启动,优先级(PR)为23,占用的虚拟内存总量(VIRT)为1236M,未被换出的物理内存(RES)为360M,共享内存(SHR)为2384 kb。通过这几个选项可以了解java进程对内存的使用量,有助于系统管理员对系统虚拟内存使用状况的掌控。
此刻java进程处于休眠状态(S),从上次更新到现在java占用cpu时间(%CPU)为6%,占用物理内存(%MEM)为4.4%,从进程启动到现在java占用cpu总时间(TIME+)为“382:24.14”,单位是1/100秒。通过了解这些信息,可以使系统管理员掌握java进程对系统CPU、物理内存的使用状况。
两个httpd进程由nobody用户启动,优先级都为15,同时都处于休眠状态。
除去这两个进程,还有top进程,也就是我们执行top命令产生的进程,从进程状态项可知,此进程处于运行状态,另一个是init进程,即所有系统进程的父进程,对应的PID为1。
当然top的输出还有很多进程信息,这里仅仅拿出前几个进程进行重点讲解,理解其它进程的含义基本与这些相同。

# w
12:27:16 up 16 min (运行天数), 2 users (当前系统登录用户数 如果要删除某个用户可以查看有多少用户登录了系统),

用 lsof 寻找打开的文件
lsof (list open files) 命令列出特定的文件系统、目录或设备上所有打开的文件以及与它们相关联的进程。在大多数 UNIX 和类 UNIX 系统上都可以使用 lsof 命令。

lsof

    在Windows中删除文件时,会出现被占用而暂时无法删除的情况,这个我们会一款非常好用的软件Unlocker,那么在Linux中类似的情况如何处理了?今天我们来学习lsof命令。
    lsof全称list open files。用于查看进程打开的文件、目录和套接字等信息。

2.进程的分类
按照进程的功能和运行的程序分类,进程可划分为两大类:
系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。
交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。

 

如果需要马上卸载文件系统,而文件系统报告忙碌,还有其他办法。如果您是系统的惟一用户,那么只需终止阻止文件系统卸载的进程。这需要查看所有窗口,寻找 并终止正在写这个分区或使用它作为当前工作目录的暂停的进程或后台进程。但是,在有许多本地用户和远程用户的多用户系统上,这种方法是不实际的。幸运的 是,开放源码社区提供了一些命令,可以轻松地识别并终止这些进程。

用法示例

1、通过文件定位占用的进程

[root@localhost ~]# top -d 2 > top.txt
[root@localhost ~]# lsof top.txt
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
  Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
top     8900 root    1w   REG    8,2    69035 469790741 top.txt

2、通过文件描述符定位进程

[root@localhost ~]# lsof -d 5 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND  PID  USER   FD   TYPE      DEVICE SIZE/OFF NODE       NAME
systemd  1    root   5u   a_inode   0,10     0     7450       [signalfd]
Xvnc     2678 root   5u   IPv6      41776    0t0   TCP *:6003 (LISTEN)

3、通过进程定位文件

[root@localhost ~]# ps -ef |grep -i  mysql | grep -v grep
mysql 2680  1  2 7月19 ?  11:44:50 /usr/libexec/mysqld --basedir=/usr
[root@localhost ~]# lsof -p 2680 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
     Output information may be incomplete.
COMMAND  PID  USER   FD    TYPE  DEVICE SIZE/OFF  NODE   NAME
mysqld  2680  mysql  cwd   DIR   8,2    4096      319571 /var/lib/mysql
mysqld  2680  mysql  rtd   DIR   8,2    254       512    /

4、查看用户打开的文件

[root@localhost ~]# lsof -u root | tail -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND   PID   USER  FD     TYPE DEVICE  SIZE/OFF NODE NAME
kworker/3 39337 root  cwd    DIR  8,2     254      512  /
kworker/3 39337 root  rtd    DIR  8,2     254      512  /
kworker/3 39337 root  txt   unknown                     /proc/39337/exe

5、查看程序所占用的端口

[root@localhost ~]# lsof -i:22
COMMAND PID    USER   FD  TYPE  DEVICE      SIZE/OFF NODE NAME
sshd    27597  root   3u  IPv4 1460505039   0t0      TCP *:ssh (LISTEN)
sshd    27597  root   4u  IPv6 1460505041   0t0      TCP *:ssh (LISTEN)

一 、进程的概念和分类
1.进程的概念
Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用同一个linux系统;多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这个任务完成,才从任务队列中去除。这就是多任务的概念。
上面说的是单CPU多任务操作系统的情形,在这种环境下,虽然系统可以运行多个任务,但是在某一个时间点,CPU只能执行一个进程,而在多CPU多任务的操作系统下,由于有多个CPU,所以在某个时间点上,可以有多个进程同时运行。
进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。
需要注意的是:程序和进程是有区别的,进程虽然有程序产生,但是它并不是程序,程序是一个进程指令的集合,它可以启用一个或多个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进程仅仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存资源随之释放。
例如,用户在linux上打开一个文件、就会产生一个打开文件的进程,关闭文件,进程也随机关闭。如果在系统上启动一个服务,例如启动tomcat服务,就会产生一个对应的java的进程。而如果启动apache服务,就会产生多个httpd进程。

-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-C  ps -C nginx 只显示某个程序的所有进程
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行

第一个命令返回的输出符合预期,因为它引用文件系统的挂载点。第二个命令表明,不能使用标准的 fuser 选项直接查询底层设备。第三个命令说明,-m 选项允许直接指定设备。可以在第一个和第三个命令中添加 -k 选项,从而终止与 /dev/sdb1 设备上的文件系统相关联的进程。

用法示例

1、不带参数的示例

[root@localhost ~]# ps
  PID TTY          TIME CMD
11047 pts/0    00:00:00 ps
24892 pts/0    00:00:00 su
25142 pts/0    00:00:00 bash

2、仅显示与当前用户相关的进程和相关信息

[root@localhost ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R     0 22720 25142  0  80   0 - 38292 -      pts/0    00:00:00 ps
4 S     0 24892 22641  0  80   0 - 58599 do_wai pts/0    00:00:00 su
4 S     0 25142 24892  0  80   0 - 29305 do_wai pts/0    00:00:00 bash
  • F:表示进程标志,说明当前进程的权限,若为4表示进程权限为root,若为1表示些子进程仅可进行复制(fork)而无法实际运行
  • S:表示进程状态,主要状态有:
      R:进程正在运行
      S:进程处于睡眠状态,但可以被唤醒
      D:进程处于不可被唤醒的睡眠状态,通常该进程可能在等待I/O
      T:停止状态,可能是在工作控制或除错状态
      Z:僵尸状态,进行已经终止但却无法释放内存等
  • UID/PID/PPID:进行的所属UID/PID/PPID
  • C:CPU使用率,单位为%
  • PRI/NI:Priority/Nice缩写,表示进程被CPU执行的优先级,数值越小越快被CPU执行
  • ADDR:与内存相关,ADDR表示该进程在内存的哪个部分,如果是Running进程,会显示 -
  • SZ:与内存相关,表示该进程使用了多少内存;
  • WCHAN:与内存相关,表示该进程目前是否正在运行,-表示正在运行中
  • TTY:启动进程的终端名称
  • TIME:进程的实际CPU占用时间之和,单位为秒
  • CMD:进程命令

3、查看系统所有进程

[root@localhost ~]# ps aux
USER PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root   2  0.0  0.0      0     0 ?        S    8月08   0:00 [kthreadd]
root   3  0.0  0.0      0     0 ?        S    8月08   0:03 [ksoftirqd/0]
root   5  0.0  0.0      0     0 ?        S<   8月08   0:00 [kworker/0:0H]
root   8  0.0  0.0      0     0 ?        S    8月08   0:00 [migration/0]
  • USER:进程所属用户
  • PID:进程标识符
  • %CPU:进程的CPU占比
  • %MEM:进程物理内存占比
  • VSZ:进程虚拟内存(KB)使用量
  • RSS:进程占用的固定内存量(KB)
  • TTY:启动进程的终端名称
  • STAT:进程状态
  • START:进程启动时间
  • TIME:进程的实际CPU占用时间之和
  • COMMAND:进程命令

在Linux中ps通常有三种不同的书写格式

  • BSD格式:选项前不加短横线 - ,多个选项可以组合使用如ps aux
  • UNIX格式:选项前加短横线 -,多个选项可以组合使用如ps -aux
  • GNU长格式:选项前加双短横线 --,如 ps --context

因此ps aux 和ps -aux 在显示的输出信息是一样的。

4、显示自定义列

[root@localhost ~]# ps -eo pid,user,cmd
PID USER     CMD
  2 root     [kthreadd]
  3 root     [ksoftirqd/0]
  5 root     [kworker/0:0H]
  8 root     [migration/0]

5、对输出结果进行排序

[root@localhost ~]# ps -ef --sort=uid,-ppid,+pid
UID  PID    PPID  C STIME TTY        TIME CMD
root 31637 31624  0 17:42 pts/1  00:00:00 less -s
root 40772 25142  0 17:44 pts/0  00:00:00 ps -ef --sort=uid,-ppid,+pid
root 40773 25142  0 17:44 pts/0  00:00:00 more
root 25142 24892  0 15:32 pts/0  00:00:00 bash
root 31624 24164  0 17:42 pts/1  00:00:00 man ps
root 24164 23955  0 15:32 pts/1  00:00:00 bash
root 23955 23586  0 15:32 pts/1  00:00:00 su root
root 24892 22641  0 15:32 pts/0  00:00:00 su root

2.4 利用lsof监控系统进程与程序
lsof全名list opened files,也就是列举系统中已经被打开的文件,通过lsof,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
lsof指令功能强大,这里介绍“-c,-g,-p,-i”这四个最常用参数的使用。更详细的介绍请参看man lsof。
lsof filename:显示使用filename文件的进程。
如果想知道某个特定的文件由哪个进程在使用,可以通过“lsof 文件名”方式得到,例如:
[[email protected] ~]# lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslogd 2027 root 1w REG 8,6 43167 31916 /var/log/messages
从这个输出可知,/var/log/messages文件是由syslogd进程在使用。
lsof -c abc :显示abc进程现在打开的文件,例如:
[[email protected] ~]# lsof -c nfs
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
nfsd4 2761 root cwd DIR 8,3 4096 2 /
nfsd4 2761 root rtd DIR 8,3 4096 2 /
nfsd4 2761 root txt unknown /proc/2761/exe
nfsd 2762 root cwd DIR 8,3 4096 2 /
nfsd 2762 root rtd DIR 8,3 4096 2 /
nfsd 2762 root txt unknown /proc/2762/exe
nfsd 2763 root cwd DIR 8,3 4096 2 /
nfsd 2763 root rtd DIR 8,3 4096 2 /
nfsd 2763 root txt unknown /proc/2763/exe
上例显示了nfs进程打开的文件信息,FD列表示文件描述符,TYPE列显示文件的类型,SIZE列显示文件的大小,NODE列显示本地文件的node码,NAME列显示文件的全路径或挂载点。
lsof -g gid:显示指定的进程组打开的文件情况,例如:
[[email protected] ~]# lsof -g 3626
COMMAND PID PGID USER FD TYPE DEVICE SIZE NODE NAME
sendmail 3626 3626 smmsp cwd DIR 8,8 4853760 32714 /var/spool/clientmqueue
sendmail 3626 3626 smmsp rtd DIR 8,10 4096 2 /
sendmail 3626 3626 smmsp txt REG 8,9 732356 1152124 /usr/sbin/sendmail.sendmail
sendmail 3626 3626 smmsp mem REG 8,10 106397 1158794 /lib/ld-2.3.4.so
sendmail 3626 3626 smmsp mem REG 8,10 95148 1175044 /lib/libnsl-2.3.4.so
.............省略...............
sendmail 3626 3626 smmsp 3u unix 0xf41e5bc0 9592 socket
sendmail 3626 3626 smmsp 4wW REG 8,8 50 523293 /var/run/sm-client.pid
其中,PGID列表示进程组的ID编号。
上面输出,显示了sendmail程序当前打开的所有文件、设备、库及套接字等。
lsof -p PID:PID是进程号,通过进程号显示程序打开的所有文件及相关进程,例如,想知道init进程打开了哪些文件的话,可以执行“lsof -p 1”命令,输出结果如下:
[[email protected] ~]# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 8,10 4096 2 /
init 1 root rtd DIR 8,10 4096 2 /
init 1 root txt REG 8,10 32684 897823 /sbin/init
init 1 root mem REG 8,10 56320 2175328 /lib/libselinux.so.1
init 1 root mem REG 8,10 106397 1158794 /lib/ld-2.3.4.so
init 1 root mem REG 8,10 1454462 1161560 /lib/tls/libc-2.3.4.so
init 1 root mem REG 8,10 53736 1158819 /lib/libsepol.so.1
init 1 root 10u FIFO 0,13 966 /dev/initctl

 

在这里,第二个进程 (emacs) 是第一个进程 (bash shell) 的子进程,因此在 fuser 命令杀死第一个进程时它就会终止。
如果希望指定底层物理设备名,而不是它包含的文件系统的挂载点,那么还必须指定 -m 选项,如下面所示

ps

    在Windows系统中用于查看进程通常是通过任务管理器。而在Linux中,我们用ps(Process Status)命令来查看进程。

2.2利用pstree监控系统进程
pstree命令以树形结构显示程序和进程之间的关系,使用格式如下:
pstree [-acnpu] [<PID>/<user>]
选项含义如下:
-a  显示启动每个进程对应的完整指令,包含启动进程的路径、参数等等。
-c  不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
-n  根据进程PID号来排序输出,默认是以程序名称排序输出的。
-p  显示进程的PID。
-u  显示进程对应的用户名称。
PID:即进程对应的PID号,或者叫进程识别号。
user:系统用户名。
pstree清楚的显示了程序和进程之间的关系,如果不指定进程的PID号,或者不指定用户名称,则将以init进程为根进程,显示系统的所有程序和进程信息,若指定用户或PID,则将以用户或PID为根进程,显示用户或PID对应的所有程序和进程。
举例如下:
如果想知道某个用户下都启动了哪些进程的话,pstree指令可以很容易实现,下面显示mysql用户下对应的进程信息,执行如下命令:
[[email protected] ~]# pstree mysql
mysqld---6*[{mysqld}]
该输出显示了mysql用户下对应的进程为mysqld,并且mysqld进程拥有5个子进程(5个子进程加一个父进程,共6个进程)。
为了更详细的了解每个进程的信息,例如每个子进程和父进程对应的PID,执行如下命令:
[[email protected] ~]# pstree -c -p mysql
mysqld(18785)-+-{mysqld}(18787)
|-{mysqld}(18788)
|-{mysqld}(18789)
|-{mysqld}(18790)
|-{mysqld}(18791)
`-{mysqld}(29625)
通过“-p、-c”参数,清楚的显示了父进程和子进程,以及它们各种的PID。
如果知道进程对应的PID,想得到进程是由哪个用户启动的,可以执行如下命令:
[[email protected] ~]# pstree -u 26037
httpd---10*[httpd(nobody)]
从上面可知,httpd进程是由nobody用户启动的。
如果要查看httpd父进程和每个子进程分别对应的PID,可以执行如下命令组合:
[[email protected] ~]# pstree -u -p 26037
httpd(26037)-+-httpd(24562,nobody)
|-httpd(24563,nobody)
|-httpd(24566,nobody)
|-httpd(24567,nobody)
|-httpd(24631,nobody)
|-httpd(24648,nobody)
|-httpd(24650,nobody)
|-httpd(24654,nobody)
|-httpd(26156,nobody)
`-httpd(29014,nobody)
如果要得到启动httpd进程的程序路径、参数组合,执行如下命令:
[[email protected] ~]# pstree -a -u -p 26037
httpd,26037 -k start
|-httpd,24563,nobody -k start
|-httpd,24566,nobody -k start
|-httpd,24567,nobody -k start
|-httpd,24631,nobody -k start
|-httpd,24648,nobody -k start
|-httpd,24650,nobody -k start
|-httpd,24654,nobody -k start
|-httpd,26156,nobody -k start
`-httpd,29014,nobody -k start

 

我的使用实例

function umount2 ()
{
#   set -x
    MYDIR=$1
        echo "$THISH  umount $MYDIR" >> $LOG_FILE
    umount $MYDIR >> $LOG_FILE
    RET=$?
    if [ $RET -ne 0 ]; then
                echo "$THISH fuser -k $MYDIR" >> $LOG_FILE
        fuser -k  $MYDIR >>$LOG_FILE
            echo "$THISH  umount $MYDIR" >> $LOG_FILE
        umount $MYDIR >> $LOG_FILE
        RET=$?
        if [ $RET -ne 0 ]; then
            lsof  $MYDIR >> $LOG_FILE
            return 1
        fi
    fi

    return 0    
}

用法示例

1、显示信号列表
sbf282.com 1

除以上显示信号,还有一个特殊的编号0为测试信号,其作用如下:

  • 用于测试目标进程是否存在
[root@localhost ~]# kill -l 0
T
[root@localhost ~]# kill -0 99999
bash: kill: (99999) - 没有那个进程
  • 用于测试当前用户是否拥有向该进程发送信号的权限
[admin@localhost ~]# kill -0 2325
bash: kill: (2325) - 操作不被允许

2、查看信号对应的编号或名称

[root@localhost ~]# kill -l SIGHUP
1
[root@localhost ~]# kill -l KILL
9
[root@localhost ~]# kill -l 9
KILL

在Linux中常用信号如下所示:

信号名称 编号 解释
HUP 1 终端断线
INT 2 中断(同Ctrl+C)
QUIT 3 退出(同Ctrl+)
KILL 9 强制终止
TEEM 15 终止
CONT 18 继续(与STOP相反)
STOP 19 暂停(同Ctrl+Z)

3、强制终止进程

[root@localhost ~]# kill -9 26744
[root@localhost ~]# kill -kill 30470

在使用kill -9需要注意的事项如下所示:

  • kill不能杀死进程为1的init进程
  • 在使用kill -9时是强行终止进程且没有通知目标进程进行自我清理,而是突然被中止,可以造成资源无法正常释放,数据无法同步到磁盘等,在使用前需要三思

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
sbf282.com 2

 

lsof 命令还有许多选项,可以帮助您识别不同类型的文件系统上打开的文件和目录、打开了网络套接字的进程、正在使用特定的库的进程等等。lsof 命令的缺点是,必须联系用户并要求他们终止某些进程,或者自己手工终止它们。fuser 命令更复杂,但是更强大,在作为根用户运行时可以替您执行许多进程终止工作。

fuser与lsof对比

对比项 fuser lsof
定位方式 通过文件查找进程 通过进程查找文件
所属标准 POSIX -
参数类型 文件/网络端口 文件/PID/网络端口
进程输出 PID PID详细信息
是否可发送信息 可以,使用-k 不可以

考虑一个现实中的实际需求。对于一个 C/S 模型中的 server 程序来说,它会为多个 client
程序请求创建多个 socket 端口给与响应。如果恰好有大量的 client 同时向 server 发出请
求,那么此时 server 就会需要创建大量的 socket 连接。但在一个系统当中,往往需要限制单
个 server 程序所能使用的最大 socket 数,以供其他的 server 程序所使用。那么我们如何
来做到这一点呢?答案是我们可以通过 ulimit 来实现!细心的读者可能会发现,通过前面章节的
介绍似乎没有限制 socket 使用的 ulimit 选项。是的,ulimit 并没有哪个选项直接说是用来
限制 socket 的数量的。但是,我们有 -n 这个选项,它是用于限制一个进程所能打开的文件描
述符的最大值。在 Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当
然也是文件。在 Linux 下创建一个新的 socket 连接,实际上就是创建一个新的文件描述符。如
下图所示(查看某个进程当前打开的文件描述符信息):

这更方便,因为它至少指出了进程是什么程序。在通过 fuser 命令获得 PID 信息之后,可以在终止进程之前结合使用标准的 ps 和 egrep 命令了解尽可能详细的相关信息,如下面所示

pstree

    在使用ps查看进程十分方便,但若想查看详细进程和子进程时,则需要使用pstree全命令。由于pstree不是系统自带,需要自行安装

yum -y install pstree

 

手工处理umount失败

[root@web2-server yum.repos.d]# umount /mnt/cdrom/ -f //强制卸载也不行
umount2: 设备或资源忙
umount: /mnt/cdrom: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
umount2: 设备或资源忙
[root@web2]# fuser -m /mnt/cdrom/
/mnt/cdrom/: 1338c
[root@web2]# ps aux |grep 1338
root 1338 0.0 0.2 108292 1912 pts/2 Ss+ 14:27 0:00 -bash
root 1423 0.0 0.1 103236 884 pts/1 S+ 14:49 0:00 grep 1338
[root@web2]# kill -9 1338
[root@web2]# fuser -m /mnt/cdrom
[root@web2]# umount /mnt/cdrom/

参考链接
linux umount 提示"device is busy" 终极解决

基本用法

pidof [选项] [文件名]

其常用选项参数如下所示:

选项 说明
-?或-h 显示帮助信息
-a 显示打开文件存在的进程
-c 进程名 显示指定进程所打开的文件
-d FD 显示文件描述符(FD)占用的进程
+d 目录名 显示当前目录下被打开的文件
+D 目录名 递归显示当前目录下被打开的文件
-i 条件 显示符合条件的进程
-p pid 显示指定PID打开的文件
-u uid 显示指定UID打开的文件
-g 显示所属组标识符PGID
R 显示父进程PPID

其中选项 -i 支持的条件如下所示:

条件 说明 示例
4/6 IPv4/ IPv6 lsof -i
protocol UDP/TCP lsof -i TCP
hostname 网络主机名 lsof -i@localhost
hostaddr 网络地址 lsof -i@192.168.8.8
service 服务名称,可查看/etc/services lsof -i:ssh
port 端口 lsof -i:22

lsof输出的详细信息解释如下:

  • COMMAND:进程名称,如果名称较长,则默认只显示前9个字符
  • PID:进程标识符,如果添加-R参数,则显示父进程PPID
  • USER:进程所有者,如果添加-g参数,则显示组标识符PGID
  • FD:文件描述符
  • TYPE:文件类型,常见类型如下所示:
    DIR:表示目录
    REG:表示普通文件
    CHR:表示字符类型
    BLK:表示块设备类型
    UNIX:表示UNIX套接字
    FIFO:表示先进先出队列
    IPv4:表示IPv4套接字
    IPv6:表示IPv6套接字

文件描述符FD,但却可以表示两类内容:

  • 第一类是文件描述符
    0:标准输入
    1:标准输出
    2:标准错误输出
    n:其他文件描述符的数值

sbf282.com 3

  • 第二类描述文件特征的标识
    CWD:表示应用程序的当前工作目录,即程序启动的目录
    txt:表示文件类型为程序代码或数据
    mem:内存映射文件
    pd:父目录
    rtd:根目录
    DEL:表示文件已经删除但还存在于内存中

load average: 0.06, 0.03, 0.00 单位时间段内CPU平均消耗 

与 lsof 命令一样,作为命令行参数提供文件系统挂载点名称是使用 fuser 命令识别阻止文件系统卸载的进程的最简单方法:

基本用法

pidof [选项] [程序名]

其常用选项参数如下所示:

选项 说明
-s 仅返回一个PID
-c 仅返回具有相同root目录的PID
-x 显示由脚本开启的进程
-o omitpid 忽略指定的PID
pidof命令的返回值通常只有两个:
- 0:pidof命令至少找到一个对应的PID
- 1:pidof没有找到任何匹配的PID

-u
用户最大可用的进程数。
ulimit – u 64;限制用户最多可以使用 64 个进程。

在默认情况下,lsof 命令列出当前打开的所有文件、共享库和目录,并提供尽可能多的相关信息。即使在负载很轻的系统上,这个命令的输出也非常长,因此通常通过命令行参数指定一 个目录名,或者使用管道筛选它的输出。例如,假设希望卸载挂载在 /opt2目录上的文件系统。为了查看与 /opt2 目录相关联的所有进程,应该执行下面所示的命令。

用法示例

1、显示运行程序的PID

[root@localhost ~]# pidof sshd
34128 34059 28835 28820 24697 24627 23228 23215 1995

在显示的结果可以看到共有9个PID,则说明服务器上9个进程均是由sshd启动的。

2、显示Shell的进程

[root@localhost ~]# cat test.sh
#!/bin/bash
i=1;
while [ $i -le 10000 ]
do
 echo $i
 i=$((i+1))
 sleep 120s
done
[root@localhost ~]# ./test.sh &
[root@localhost ~]# pidof -x test.sh
36554

3、显示指定程序的PID

[root@localhost ~]# pidof -s sshd
7524

4、忽略指定的PID

[root@localhost ~]# pidof sshd
9104 9103 7524 7434 4474 4462 1995
[root@localhost ~]# pidof sshd -o 1995
11979 11978 7524 7434 4474 4462

ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 _ [migration/0]
2 4 0 0 ? -1 S 0 0:18 _ [ksoftirqd/0]

需要终止所有这些进程,然后才能卸载 /opt2 分区。因为这个列表中的进程都不能写任何文件,所以可以使用 kill 命令并指定第二列中列出的进程 ID (PID) 以终止它们,然后就可以顺利地卸载分区。注意,PID 23402 与最后两行相关联 — 第一行表示 more 命令以 /opt2 作为当前工作目录 (cwd),第二行表示 more 命令打开了 /opt2/resume.txt 文件。

基本用法

kill [选项] [PID]

其常用选项如下所示:

选项 说明
-s signal 向目标进程发送指定的信号类型,信号可以为名称或数字
-l 显示信号名称列表,如果在-l加编号则查看信号名称,反之亦然
-a 处理当前进程时,不限制命令和PID的对应关系
-p 指定kill命令仅显示相关进程的进程号,而不发送任何信号
  • 无选项:表示向目标进程发送默认的终止信号,即SIGTERM
  • PID>0:表示向目标进程发送信号,此处的PID可以是多个PID,用空格进行分隔
  • PID=0:表示向当前进程组的所有进程发送信号
  • PID=-1:表示向除当前 kill 进程和 init 进程之外的所有进程发送信号
  • PID<-1:表示向进程组PGID的所有进程发送信号,如-123,则向进程组PGID为123的所有进程发送信号

 

然后,可以使用标准的 kill 命令手工终止指定的进程,或者像下一节中解释的,使用 fuser 命令的一些高级功能自动地终止它们。

 

用 fuser 寻找用户进程
fuser (find user processes) 命令也是一个开放源码应用程序,可以帮助您识别阻止文件系统卸载的进程。fuser 命令寻找与作为命令行参数指定的文件、目录或文件系统相关联的进程。本文主要关注对文件系统挂载点使用 fuser。关于 fuser 命令的更多信息,请参见它的在线参考信息。fuser 命令要求系统支持 /proc 文件系统。因此,在所有 Linux 发行版和 FreeBSD 系统上都可以使用它。关于获得 fuser 命令的源代码的方法请参见 参考资料。

下半节课

为了干净地关闭或热交换 UNIX 或类 UNIX 系统上的存储硬件,必须能够卸载使用此设备上的存储的所有文件系统。但是,如果正在使用文件系统中的文件或目录,就无法卸载它。lsof 和 fuser 命令可以帮助您识别并终止那些正在使用存储设备上的文件或从存储设备执行的进程。使用这些命令有助于寻找那些阻止存储设备卸载的进程,减少麻烦,让您能够继续处理更重要的系统管理任务。

 

但是,fuser 命令的默认输出不便于最终用户使用,即使按 Linux 标准来看也是如此。fuser 命令提供一个 -v 选项,它在 fuser 命令的输出中增加一些与标准 ps 命令相似的输出,如下面所示。

ab(apache benchmark测试工具):测试apache

在这里,busy 意味着一个进程正在写这个文件系统或者进程是从它运行的。在这两种情况下,都无法卸载文件系统,这是计算机系统的基本规则之一。如果不采用这个规则,可以 在进程正在写文件系统包含的文件时卸载文件系统,就会让文件处于不一致的状态,而文件系统本身标为 CLEAN。

 

umount 命令的标准 Linux 版本包含一个延迟卸载选项 -l,它有助于卸载正在使用的文件系统。这个命令需要 Linux 内核 2.4.11 或更高版本,目前这通常没问题。执行 umount -l /name/of/file system 可以让指定的文件系统与系统的目录层次结构脱离,让新进程不能使用这个文件系统,然后当正在访问它的所有进程都终止时卸载它。这很方便,但是当需要马上卸载文件系统时它并不合适。

解决方案:

用 fuser 终止进程
在通过参数指定挂载点时,fuser 命令的 -k 选项会自动地终止找到的进程。当然,必须作为根用户执行 fuser 命令,才能终止属于其他用户的进程,如下面所示

zabbix监听端口:10050
mysql监听端口:3306
nginx监听端口:80
stmp sendmail监听端口:25

前三个与 /opt2 目录相关联的命令与前面一样,但是后两个命令是由另一个用户运行的。其中的 emacs 命令用于编辑文件,所以可以让 USER 列中列出的用户保存文件并退出,然后终止这个进程。

用户进程的有效范围

cat /proc/cpuinfo
cat /proc/cpuinfo |grep 'core id'
processor :线程数  逻辑核心数   从0开始算  ,衡量性能
core id:核心数  物理核心数 从0开始算

代码:

[root@test ~]# cat /etc/security/limits.d/90-nproc.conf    # Default limit for number of user's processes to prevent    # accidental fork bombs.    # See rhbz #432903 for reasoning.*          soft    nproc     20480

#注意,root用户不受nproc限制

 

 

打开文件句柄数和最大用户进程数限制:

在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。

查看方法

我们可以用ulimit -a来查看所有限制值

复制内容到剪贴板

条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。

 

用于动态监控进程所占系统资源,每隔3秒变一次。
RES 这一项为进程所占内存大小,而 %MEM 为使用内存百分比
按 “shift + m”, 可以按照内存使用大小排序。
按 “shift + p”, 可以按照CPU使用排序。
按数字 ‘1’ 可以列出各颗cpu的使用状态。
top -bn1 它表示非动态打印系统资源使用情况,可以用在shell脚本中
top -c 最右侧的命令可以显示更详细的信息 例如命令路径

redhat7支持  free -h 

 

  • 在前台的进程

在应用程序的启动脚本中
如果用户要对某个应用程序 myapp 进行限制,可以写一个简单的脚本 startmyapp。

 

本文由胜博发-操作发布,转载请注明来源:访问类型如下sbf282.com:,用来管理运行程序的标