找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5230|回复: 0

Linux Shell常用技巧(九)

[复制链接]
发表于 2012-4-21 10:21:10 | 显示全部楼层 |阅读模式
  1. 十九.  和系统运行进程相关的Shell命令:
  2.    
  3.    1.  进程监控命令(ps):
  4.     要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
  5.     ps命令存在很多的命令行选项和参数,然而我们最为常用只有两种形式,这里先给出与它们相关的选项和参数的含义:
  6. 选项        说明
  7. a        显示终端上的所有进程,包括其他用户的进程。
  8. u        以用户为主的格式来显示程序状况。
  9. x        显示所有程序,不以终端来区分。
  10. -e        显示所有进程。
  11. o        其后指定要输出的列,如user,pid等,多个列之间用逗号分隔。
  12. -p        后面跟着一组pid的列表,用逗号分隔,该命令将只是输出这些pid的相关数据。
  13.     /> ps aux
  14.     root         1  0.0  0.1   2828  1400 ?        Ss   09:51   0:02 /sbin/init
  15.     root         2  0.0  0.0      0          0 ?        S    09:51   0:00 [kthreadd]
  16.     root         3  0.0  0.0      0          0 ?        S    09:51   0:00 [migration/0]
  17.     ... ...   
  18.     /> ps -eo user,pid,%cpu,%mem,start,time,command | head -n 4
  19.     USER       PID %CPU %MEM  STARTED     TIME        COMMAND
  20.     root         1         0.0    0.1   09:51:08     00:00:02  /sbin/init
  21.     root         2         0.0    0.0   09:51:08     00:00:00  [kthreadd]
  22.     root         3         0.0    0.0   09:51:08     00:00:00  [migration/0]
  23.     这里需要说明的是,ps中存在很多和进程性能相关的参数,它们均以输出表格中的列的方式显示出来,在这里我们只是给出了非常常用的几个参数,至于更多参数,我们则需要根据自己应用的实际情况去看ps的man手册。
  24.     #以完整的格式显示pid为1(init)的进程的相关数据
  25.     /> ps -fp 1
  26.     UID        PID  PPID  C STIME TTY          TIME   CMD
  27.     root         1        0  0 05:16   ?        00:00:03 /sbin/init
  28.    
  29.     2.  改变进程优先级的命令(nice和renice):
  30.     该Shell命令最常用的使用方式为:nice [-n <优先等级>][执行指令],其中优先等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
  31.     #后台执行sleep 100秒,同时在启动时将其nice值置为19
  32.     /> nice -n 19 sleep 100 &
  33.     [1] 4661
  34.     #后台执行sleep 100秒,同时在启动时将其nice值置为-19
  35.     /> nice -n -19 sleep 100 &
  36.     [2] 4664
  37.     #关注ps -l输出中用黄色高亮的两行,它们的NI值和我们执行是设置的值一致。
  38.     /> ps -l
  39.     F S   UID   PID  PPID  C PRI  NI  ADDR  SZ    WCHAN  TTY       TIME        CMD
  40.     4 S     0  2833  2829  0  80   0     -      1739     -         pts/2    00:00:00  bash
  41.     0 S     0  4661  2833  0  99  19    -      1066     -         pts/2    00:00:00  sleep
  42.     4 S     0  4664  2833  0  61 -19    -      1066     -         pts/2    00:00:00  sleep
  43.     4 R     0  4665  2833  1  80   0     -      1231     -         pts/2    00:00:00  ps
  44.    
  45.     renice命令主要用于为已经执行的进程重新设定nice值,该命令包含以下几个常用选项:
  46. 选项        说明
  47. -g        使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
  48. -p        改变该程序的优先权等级,此参数为预设值。
  49. -u        指定用户名称,修改所有隶属于该用户的程序的优先权。
  50.     #切换到stephen用户下执行一个后台进程,这里sleep进程将在后台睡眠1000秒。
  51.     /> su stephen
  52.     /> sleep 1000&  
  53.     [1] 4812
  54.     /> exit   #退回到切换前的root用户
  55.     #查看已经启动的后台sleep进程,其ni值为0,宿主用户为stephen
  56.     /> ps -eo user,pid,ni,command | grep stephen
  57.     stephen   4812   0 sleep 1000
  58.     root        4821    0 grep  stephen
  59.     #以指定用户的方式修改该用户下所有进程的nice值
  60.     /> renice -n 5 -u stephen
  61.     500: old priority 0, new priority 5
  62.     #从再次执行ps的输出结果可以看出,该sleep后台进程的nice值已经调成了5
  63.     /> ps -eo user,pid,ni,command | grep stephen
  64.     stephen   4812   5 sleep 1000
  65.     root         4826   0 grep  stephen
  66.     #以指定进程pid的方式修改该进程的nice值
  67.     /> renice -n 10 -p 4812
  68.     4812: old priority 5, new priority 10
  69.     #再次执行ps,该sleep后台进程的nice值已经从5变成了10
  70.     /> ps -eo user,pid,ni,command | grep stephen
  71.     stephen   4812  10 sleep 1000
  72.     root        4829   0 grep  stephen
  73.     3.  列出当前系统打开文件的工具(lsof):
  74.     lsof(list opened files),其重要功能为列举系统中已经被打开的文件,如果没有指定任何选项或参数,lsof则列出所有活动进程打开的所有文件。众所周知,linux环境中任何事物都是文件,如设备、目录、sockets等。所以,用好lsof命令,对日常的linux管理非常有帮助。下面先给出该命令的常用选项:
  75. 选项        说明
  76. -a        该选项会使后面选项选出的结果列表进行and操作。
  77. -c command_prefix        显示以command_prefix开头的进程打开的文件。
  78. -p PID        显示指定PID已打开文件的信息
  79. +d directory        从文件夹directory来搜寻(不考虑子目录),列出该目录下打开的文件信息。
  80. +D directory        从文件夹directory来搜寻(考虑子目录),列出该目录下打开的文件信息。
  81. -d num_of_fd        以File Descriptor的信息进行匹配,可使用3-10,表示范围,3,10表示某些值。
  82. -u user        显示某用户的已经打开的文件,其中user可以使用正则表达式。
  83. -i        监听指定的协议、端口、主机等的网络信息,格式为:[proto][@host|addr][:svc_list|port_list]
  84.     #查看打开/dev/null文件的进程。
  85.     /> lsof /dev/null | head -n 5
  86.     COMMAND    PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  87.     init         1      root    0u   CHR    1,3      0t0 3671 /dev/null
  88.     init         1      root    1u   CHR    1,3      0t0 3671 /dev/null
  89.     init         1      root    2u   CHR    1,3      0t0 3671 /dev/null
  90.     udevd 397      root    0u   CHR    1,3      0t0 3671 /dev/null
  91.     #查看打开22端口的进程
  92.     /> lsof -i:22
  93.     COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  94.     sshd    1582 root    3u  IPv4  11989      0t0  TCP *:ssh (LISTEN)
  95.     sshd    1582 root    4u  IPv6  11991      0t0  TCP *:ssh (LISTEN)
  96.     sshd    2829 root    3r   IPv4  19635      0t0  TCP bogon:ssh->bogon:15264 (ESTABLISHED)
  97.     #查看init进程打开的文件
  98.     />  lsof -c init
  99.     COMMAND PID USER   FD   TYPE     DEVICE   SIZE/OFF   NODE    NAME
  100.     init               1 root  cwd      DIR        8,2     4096              2        /
  101.     init               1 root  rtd       DIR        8,2     4096              2        /
  102.     init               1 root  txt       REG       8,2   136068       148567     /sbin/init
  103.     init               1 root  mem    REG        8,2    58536      137507     /lib/libnss_files-2.12.so
  104.     init               1 root  mem    REG        8,2   122232     186675     /lib/libgcc_s-4.4.4-20100726.so.1
  105.     init               1 root  mem    REG        8,2   141492     186436     /lib/ld-2.12.so
  106.     init               1 root  mem    REG        8,2  1855584    186631     /lib/libc-2.12.so
  107.     init               1 root  mem    REG        8,2   133136     186632     /lib/libpthread-2.12.so
  108.     init               1 root  mem    REG        8,2    99020      180422     /lib/libnih.so.1.0.0
  109.     init               1 root  mem    REG        8,2    37304      186773     /lib/libnih-dbus.so.1.0.0
  110.     init               1 root  mem    REG        8,2    41728      186633     /lib/librt-2.12.so
  111.     init               1 root  mem    REG        8,2   286380     186634     /lib/libdbus-1.so.3.4.0
  112.     init               1 root    0u     CHR        1,3      0t0           3671      /dev/null
  113.     init               1 root    1u     CHR        1,3      0t0           3671      /dev/null
  114.     init               1 root    2u     CHR        1,3      0t0           3671      /dev/null
  115.     init               1 root    3r      FIFO       0,8      0t0           7969      pipe
  116.     init               1 root    4w     FIFO       0,8      0t0           7969      pipe
  117.     init               1 root    5r      DIR        0,10        0             1         inotify
  118.     init               1 root    6r      DIR        0,10        0             1         inotify
  119.     init               1 root    7u     unix   0xf61e3840  0t0       7970      socket
  120.     init               1 root    9u     unix   0xf3bab280  0t0      11211     socket
  121.     在上面输出的FD列中,显示的是文件的File Descriptor number,或者如下的内容:
  122.     cwd:  current working directory;
  123.     mem:  memory-mapped file;
  124.     mmap: memory-mapped device;
  125.     pd:   parent directory;
  126.     rtd:  root directory;
  127.     txt:  program text (code and data);
  128.     文件的File Descriptor number显示模式有:
  129.     r for read access;
  130.     w for write access;
  131.     u for read and write access;
  132.     在上面输出的TYPE列中,显示的是文件类型,如:
  133.     DIR:  目录
  134.     LINK: 链接文件
  135.     REG:  普通文件
  136.     #查看pid为1的进程(init)打开的文件,其输出结果等同于上面的命令,他们都是init。
  137.     /> lsof -p 1
  138.     #查看owner为root的进程打开的文件。
  139.     /> lsof -u root
  140.     #查看owner不为root的进程打开的文件。
  141.     /> lsof -u ^root
  142.     #查看打开协议为tcp,ip为192.168.220.134,端口为22的进程。
  143.     /> lsof -i tcp@192.168.220.134:22
  144.     COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  145.     sshd        2829 root     3r    IPv4  19635      0t0      TCP    bogon:ssh->bogon:15264 (ESTABLISHED)   
  146.     #查看打开/root文件夹,但不考虑目录搜寻
  147.     /> lsof +d /root
  148.     #查看打开/root文件夹以及其子目录搜寻
  149.     /> lsof +D /root
  150.     #查看打开FD(0-3)文件的所有进程
  151.     /> lsof -d 0-3
  152.     #-a选项会将+d选项和-c选项的选择结果进行and操作,并输出合并后的结果。
  153.     /> lsof +d .
  154.     COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
  155.     bash       9707  root  cwd    DIR    8,1     4096         39887 .
  156.     lsof         9791  root  cwd    DIR    8,1     4096         39887 .
  157.     lsof         9792  root  cwd    DIR    8,1     4096         39887 .
  158.     /> lsof -a -c bash +d .
  159.     COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
  160.     bash        9707 root  cwd    DIR    8,1     4096         39887 .
  161.     最后需要额外说明的是,如果在文件名的末尾存在(delete),则说明该文件已经被删除,只是还存留在cache中。
  162.     4.  进程查找/杀掉命令(pgrep/pkill):
  163.     查找和杀死指定的进程, 他们的选项和参数完全相同, 这里只是介绍pgrep。下面是常用的命令行选项:
  164. 选项        说明
  165. -d        定义多个进程之间的分隔符, 如果不定义则使用换行符。
  166. -n        表示如果该程序有多个进程正在运行,则仅查找最新的,即最后启动的。
  167. -o        表示如果该程序有多个进程正在运行,则仅查找最老的,即最先启动的。
  168. -G        其后跟着一组group id,该命令在搜索时,仅考虑group列表中的进程。
  169. -u        其后跟着一组有效用户ID(effetive user id),该命令在搜索时,仅考虑该effective user列表中的进程。
  170. -U        其后跟着一组实际用户ID(real user id),该命令在搜索时,仅考虑该real user列表中的进程。
  171. -x        表示进程的名字必须完全匹配, 以上的选项均可以部分匹配。
  172. -l        将不仅打印pid,也打印进程名。
  173. -f        一般与-l合用, 将打印进程的参数。
  174.     #手工创建两个后台进程
  175.     /> sleep 1000&
  176.     3456
  177.     /> sleep 1000&
  178.     3457
  179.     #查找进程名为sleep的进程,同时输出所有找到的pid
  180.     /> pgrep sleep
  181.     3456
  182.     3457
  183.     #查找进程名为sleep的进程pid,如果存在多个,他们之间使用:分隔,而不是换行符分隔。
  184.     /> pgrep -d: sleep
  185.     3456:3457
  186.     #查找进程名为sleep的进程pid,如果存在多个,这里只是输出最后启动的那一个。
  187.     /> pgrep -n sleep
  188.     3457
  189.     #查找进程名为sleep的进程pid,如果存在多个,这里只是输出最先启动的那一个。
  190.     /> pgrep -o  sleep
  191.     3456
  192.     #查找进程名为sleep,同时这个正在运行的进程的组为root和stephen。
  193.     /> pgrep -G root,stephen sleep
  194.     3456
  195.     3457
  196.     #查找有效用户ID为root和oracle,进程名为sleep的进程。
  197.     /> pgrep -u root,oracle sleep
  198.     3456
  199.     3457
  200.     #查找实际用户ID为root和oracle,进程名为sleep的进程。
  201.     /> pgrep -U root,oracle sleep
  202.     3456
  203.     3457
  204.     #查找进程名为sleep的进程,注意这里找到的进程名必须和参数中的完全匹配。
  205.     /> pgrep -x sleep
  206.     3456
  207.     3457
  208.     #-x不支持部分匹配,sleep进程将不会被查出,因此下面的命令没有结果。
  209.     /> pgrep -x sle
  210.     #查找进程名为sleep的进程,同时输出所有找到的pid和进程名。   
  211.     /> pgrep -l sleep
  212.     3456 sleep
  213.     3457 sleep
  214.     #查找进程名为sleep的进程,同时输出所有找到的pid、进程名和启动时的参数。
  215.     /> pgrep -lf sleep
  216.     3456 sleep 1000
  217.     3457 sleep 1000
  218.     #查找进程名为sleep的进程,同时以逗号为分隔符输出他们的pid,在将结果传给ps命令,-f表示显示完整格式,-p显示pid列表,ps将只是输出该列表内的进程数据。
  219.     /> pgrep -f sleep -d, | xargs ps -fp
  220.     UID        PID  PPID  C STIME TTY          TIME CMD
  221.     root      3456  2138  0 06:11 pts/5    00:00:00 sleep 1000
  222.     root      3457  2138  0 06:11 pts/5    00:00:00 sleep 1000  
复制代码
来自:http://www.cnblogs.com/stephen-l ... /12/08/2261939.html

目录:
Linux Shell常用技巧(一)
http://www.acejoy.com/thread-4312-1-1.html
一. 特殊文件: /dev/null和/dev/tty
二. 简单的命令跟踪
三. 正则表达式基本语法描述
四. 使用cut命令选定字段
五. 计算行数、字数以及字符数
六. 提取开头或结尾数行

Linux Shell常用技巧(二)
http://www.acejoy.com/thread-4313-1-1.html
七. grep家族

Linux Shell常用技巧(三)
http://www.acejoy.com/thread-4314-1-1.html
八. 流编辑器sed

Linux Shell常用技巧(四)
http://www.acejoy.com/thread-4315-1-1.html
九. awk实用功能
十. awk表达式功能

Linux Shell常用技巧(五)
http://www.acejoy.com/thread-4316-1-1.html
十一.awk编程

Linux Shell常用技巧(六)
http://www.acejoy.com/thread-4317-1-1.html
十二.行的排序命令sort
十三.删除重复行的命令uniq
十四.文件压缩解压命令tar
十五.大文件拆分命令split

Linux Shell常用技巧(七)
http://www.acejoy.com/thread-4318-1-1.html
十六.文件查找命令find
十七.xargs命令

Linux Shell常用技巧(八)
http://www.acejoy.com/thread-4319-1-1.html
十八.和系统运行状况相关的Shell命令

Linux Shell常用技巧(九)
http://www.acejoy.com/thread-4320-1-1.html
十九.和系统运行进程相关的Shell命令

Linux Shell常用技巧(十)
http://www.acejoy.com/thread-4321-1-1.html
二十.通过管道组合Shell命令获取系统运行数据
二十一.通过管道组合Shell命令进行系统管理

Linux Shell常用技巧(十一)
http://www.acejoy.com/thread-4322-1-1.html
二十二.交互式使用Bash Shell

Linux Shell常用技巧(十二)
http://www.acejoy.com/thread-4323-1-1.html
二十三.Bash Shell编程

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-8 09:26 , Processed in 0.057047 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表