linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法

时间:2022-07-08 11:20:33

PS查看进程

inux上进程有5种状态: 
1. 运行(正在运行或在运行队列中等待) 
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

ps工具标识进程的5种状态码: 
D 不可中断 uninterruptible sleep (usually IO) 
R 运行 runnable (on run queue) 
S 中断 sleeping 
T 停止 traced or stopped 
Z 僵死 a defunct (”zombie”) process

名称:ps 
使用权限:所有使用者 
使用方式:ps [options] [--help] 
说明:显示瞬间行程 (process) 的动态 
参数: 
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 
-A 列出所有的行程 
-w 显示加宽可以显示较多的资讯 
-au 显示较详细的资讯 
-aux 显示所有包含其他使用者的行程

au(x) 输出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
USER: 行程拥有者 
PID: pid 
%CPU: 占用的 CPU 使用率 
%MEM: 占用的记忆体使用率 
VSZ: 占用的虚拟记忆体大小 
RSS: 占用的记忆体大小 
TTY: 终端的次要装置号码 (minor device number of tty) 
STAT: 该行程的状态: 
D: 不可中断的静止 
R: 正在执行中 
S: 静止状态 
T: 暂停执行 
Z: 不存在但暂时无法消除 
W: 没有足够的记忆体分页可分配 
<: 高优先序的行程 
N: 低优先序的行程 
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O) 
START: 行程开始时间 
TIME: 执行的时间 
COMMAND:所执行的指令

范例:

ps 
PID TTY TIME CMD 
2791 ttyp0 00:00:00 tcsh 
3092 ttyp0 00:00:00 ps 
% ps -A 
PID TTY TIME CMD 
1 ? 00:00:03 init 
2 ? 00:00:00 kflushd 
3 ? 00:00:00 kpiod 
4 ? 00:00:00 kswapd 
5 ? 00:00:00 mdrecoveryd 
……. 
% ps -aux 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3] 
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd] 
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod] 
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]

具体命令解释如下: 
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。

2)ps -A 显示所有程序。

3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

4)ps -e 此参数的效果和指定”A”参数相同。

5)ps e 列出程序时,显示每个程序所使用的环境变量。

6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

7)ps -H 显示树状结构,表示程序间的相互关系。

8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

9)ps s 采用程序信号的格式显示程序状况。

10)ps S 列出程序时,包括已中断的子程序资料。

11)ps -t<终端机编号>

指定终端机编号,并列出属于该终端机的程序的状况。

12)ps u

以用户为主的格式来显示程序状况。

13)ps x

显示所有程序,不以终端机来区分。

最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

FROM: http://blog.csdn.net/cjh6311882/article/details/7611967

linux下grep命令详解

1.作用 
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expr ession Print,表示全局正则表达式版本,它的使用权限是所有用户。

2.格式 
grep [options]

3.主要参数 
[options]主要参数: 
-c:只输出匹配行的计数。 
-I:不区分大 小写(只适用于单字符)。 
-h:查询多文件时不显示文件名。 
-l:查询多文件时只输出包含匹配字符的文件名。 
-n:显示匹配行及 行号。 
-s:不显示不存在或无匹配文本的错误信息。 
-v:显示不包含匹配文本的所有行。 
pattern正则表达式主要参数: 
\: 忽略正则表达式中特殊字符的原有含义。 
^:匹配正则表达式的开始行。 
$: 匹配正则表达式的结束行。 
\<:从匹配正则表达 式的行开始。 
\>:到匹配正则表达式的行结束。 
[ ]:单个字符,如[A]即A符合要求 。 
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 
。:所有的单个字符。 
* :有字符,长度可以为0。

4.grep命令使用简单实例 
$ grep ‘test’ d* 
显示所有以d开头的文件中包含 test的行。 
$ grep ‘test’ aa bb cc 
显示在aa,bb,cc文件中匹配test的行。 
$ grep ‘[a-z]\{5\}’ aa 
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。 
$ grep ‘w\(es\)t.*\1′ aa 
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。

5.grep命令使用复杂实例 
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件: 
$ grep magic /usr/src/Linux/Doc/* 
sysrq.txt:* How do I enable the magic SysRQ key? 
sysrq.txt:* How do I use the magic SysRQ key? 
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。 
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出: 
grep: sound: Is a directory 
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法: 
明确要求搜索子目录:grep -r 
或忽略子目录:grep -d skip 
如果有很多 输出时,您可以通过管道将其转到’less’上阅读: 
$ grep magic /usr/src/Linux/Documentation/* | less 
这样,您就可以更方便地阅读。

有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。

下面还有一些有意思的命令行参数: 
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写, 
grep -l pattern files :只列出匹配的文件名, 
grep -L pattern files :列出不匹配的文件名, 
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’), 
grep -C number pattern files :匹配的上下文分别显示[number]行, 
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行, 
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

grep -n pattern files  即可显示行号信息

grep -c pattern files  即可查找总行数

这里还有些用于搜索的特殊符号: 
\< 和 \> 分别标注单词的开始与结尾。 
例如: 
grep man * 会匹配 ‘Batman’、’manic’、’man’等, 
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’, 
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。 
‘^’:指匹配的字符串在行首, 
‘$’:指匹配的字符串在行 尾,

Grep 命令 用法大全

1、 参数: 
-I :忽略大小写 
-c :打印匹配的行数 
-l :从多个文件中查找包含匹配项 
-v :查找不包含匹配项的行 
-n:打印包含匹配项的行和行标

2、RE(正则表达式) 
\ 忽略正则表达式中特殊字符的原有含义 
^ 匹配正则表达式的开始行 
$ 匹配正则表达式的结束行 
\< 从匹配正则表达式的行开始 
\> 到匹配正则表达式的行结束 
[ ] 单个字符;如[A] 即A符合要求 
[ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 
. 所有的单个字符 
* 所有字符,长度可以为0

Kill  杀死进程

常规篇:

 首先,用ps查看进程,方法如下:

$ ps -ef

……
smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal
smx       1823  1822  0 11:38 ?        00:00:00 gnome-pty-helper
smx       1824  1822  0 11:38 pts/0    00:00:02 bash
smx       1827     1  4 11:38 ?        00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
smx       1857  1822  0 11:38 pts/1    00:00:00 bash
smx       1880  1619  0 11:38 ?        00:00:00 update-notifier
……
smx      11946  1824  0 21:41 pts/0    00:00:00 ps -ef

或者:

$ ps -aux

……

smx       1822  0.1  0.8  58484 18152 ?        Sl   11:38   0:49 gnome-terminal
smx       1823  0.0  0.0   1988   712 ?        S    11:38   0:00 gnome-pty-helper
smx       1824  0.0  0.1   6820  3776 pts/0    Ss   11:38   0:02 bash
smx       1827  4.3  5.8 398196 119568 ?       Sl   11:38  26:13 /usr/lib/firefox-3.6.18/firefox-bin
smx       1857  0.0  0.1   6688  3644 pts/1    Ss   11:38   0:00 bash
smx       1880  0.0  0.6  41536 12620 ?        S    11:38   0:00 update-notifier
……
smx      11953  0.0  0.0   2716  1064 pts/0    R+   21:42   0:00 ps -aux

此时如果我想杀了火狐的进程就在终端输入:

$ kill -s 9 1827

其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。

1827则是上面ps查到的火狐的PID。

简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。

进阶篇:

改进1:

把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

$ ps -ef | grep firefox
smx       1827     1  4 11:38 ?        00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
smx      12029  1824  0 21:54 pts/0    00:00:00 grep --color=auto firefox

这次就清爽了。然后就是

$kill -s 9 1827

还是嫌打字多?

改进2——使用pgrep:

一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

$ pgrep firefox
1827

看到了什么?没错火狐的PID,接下来又要打字了:

$kill -s 9 1827

改进3——使用pidof:

看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

$ pidof firefox-bin
1827
和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:

$kill -s 9 1827

无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!

改进4:

$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9

说明:

“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。

“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。

“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。

“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

难道你不想抱怨点什么?没错太长了

改进5:

知道pgrep和pidof两个命令,干嘛还要打那么长一串!

$ pgrep firefox | xargs kill -s 9

改进6:

$ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9
kill: No such process

有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。

其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

改进7:

难道每次都要调用xargs把PID传递给kill?答案是否定的:

$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`

改进8:

没错,命令依然有点长,换成pgrep。

$kill -s 9 `pgrep firefox`

改进9——pkill:

看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。

$pkill -9 firefox

说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。

改进10——killall:

killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

$killall -9 firefox

附录:各种信号及其用途

Signal Description Signal number on Linux x86[1]
SIGABRT Process aborted 6
SIGALRM Signal raised by alarm 14
SIGBUS Bus error: "access to undefined portion of memory object" 7
SIGCHLD Child process terminated, stopped (or continued*) 17
SIGCONT Continue if stopped 18
SIGFPE Floating point exception: "erroneous arithmetic operation" 8
SIGHUP Hangup 1
SIGILL Illegal instruction 4
SIGINT Interrupt 2
SIGKILL Kill (terminate immediately) 9
SIGPIPE Write to pipe with no one reading 13
SIGQUIT Quit and dump core 3
SIGSEGV Segmentation violation 11
SIGSTOP Stop executing temporarily 19
SIGTERM Termination (request to terminate) 15
SIGTSTP Terminal stop signal 20
SIGTTIN Background process attempting to read from tty ("in") 21
SIGTTOU Background process attempting to write to tty ("out") 22
SIGUSR1 User-defined 1 10
SIGUSR2 User-defined 2 12
SIGPOLL Pollable event 29
SIGPROF Profiling timer expired 27
SIGSYS Bad syscall 31
SIGTRAP Trace/breakpoint trap 5
SIGURG Urgent data available on socket 23
SIGVTALRM Signal raised by timer counting virtual time: "virtual timer expired" 26
SIGXCPU CPU time limit exceeded 24
SIGXFSZ File size limit exceeded 25