程序员 centos Android HTML5 Ubuntu apache 微软 开源 linux命令 php nginx linux java Firefox google Python Windows mysql shell wordpress

有关进程管理的命令:ps、kill、sleep

Linux是一个多用户多任务的操作系统统,这意味着多个用户可以同时使用一个操作系统,而每个用户又可以同时运行多个命令。命令的执行是通过进程实现的。“进程”是Linux系统中一个重要的概念。

简单地说,进程是一个程序或任务的执行过程。例如,在提示符之后输入一个命令或可执行文件的名字,按下Enter键,就开始执行这个命令了。在操作系统中,为了执行这个命令,往往要创建相应的进程。通过进程的活动来完成一个预定的任务。其实,在Linux中,通常执行任何一个命令都会创建一个或多个进程,即命令是通过进程实现的。当进程完成了预期的目标,自行终止时,该命令也就执行完了。不但用户可以创建进程,系统程序也可以创建进程。可以说,一个运行着的操作系统就是由许许多多的进程组成的。

ps命令
ps命令用来查看当前系统中运行的进程的信息。它可以提供关于进程的许多信息。可以根据显示的信息确定哪个进程正在运行,哪个进程是被挂起或出了问题,进程已运行了多久,进程正在使用的资源,进程的相对优先级及进程的标志号(PID)。所有这些信息对用户都很有用,对于系统管理员来说更为重要。

一般格式:ps [选项]

常用选项
-a  显示系统中与tty相关的(除会话组长之外)所有进程的信息。
-e  显示所有进程的信息。
-f  显示进程的所有信息。
-l  以长格式显示进程信息。
-r  只显示正在运行的进程。
-u  显示面向用户的格式(包括用户名、CPU及内存使用情况等信息)。
-x  显示所有终端上的进程信息。

示例
①列出每个与当前Shell有关的进程的基本信息:
#ps
  PID TTY          time CMD
 9723 pts/0    00:00:00 bash
 9751 pts/0    00:00:00 ps

其中,各字段的含义如下:
PID  进程标志号。
TTY  该进程建立时所对应的终端,“?”表示该进程不占用终端。
TIME  报告进程累计使用的CPU时间。注意,尽管有些命令(如 sh)已经运转了很长时间,但是它们真正使用CPU的时间往往很短。所以,该字段的值往往是00:00:00。
CMD 执行进程的命令名。

 ②显示系统中所有进程的全面信息:
# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Jun25 ?        00:00:01 init [3]                  
root         2     1  0 Jun25 ?        00:00:00 [migration/0]
root         3     1  0 Jun25 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 Jun25 ?        00:00:00 [watchdog/0]
root         5     1  0 Jun25 ?        00:00:00 [migration/1]
root         6     1  0 Jun25 ?        00:00:00 [ksoftirqd/1]
root         7     1  0 Jun25 ?        00:00:00 [watchdog/1]
root         8     1  0 Jun25 ?        00:00:00 [events/0]
root         9     1  0 Jun25 ?        00:00:00 [events/1]
root        10     1  0 Jun25 ?        00:00:00 [khelper]
……
root      9755  9723  0 10:10 pts/0    00:00:00 ps -ef
各项的含义是:
UID  进程属主的用户ID号。
PID  进程ID号。
PPID  父进程的ID号。
C  进程最近使用CPU的估算。
STIME  进程开始时间,以小时:分:秒的形式给出。
TTY  该进程建立时所对应的终端,“?”表示该进程不占用终端。
TIME  报告进程累计使用的CPU时间。注意,尽管有些命令(如 sh)己经运转了很长时间,但是它们真正使用CPU的时间往往很短。所以,该字段的值往往是0:00。
CMD 是conunand(命令)的缩写。

③显示所有终端上所有用户的有关进程的所有信息:
# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      stat START   TIME command
root         1  0.0  0.0   2160   660 ?        ss   Jun25   0:01 init [3]                  
root         2  0.0  0.0      0     0 ?        S<   Jun25   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Jun25   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S<   Jun25   0:00 [watchdog/0]
root         5  0.0  0.0      0     0 ?        S<   Jun25   0:00 [migration/1]
root         6  0.0  0.0      0     0 ?        SN   Jun25   0:00 [ksoftirqd/1]
root         7  0.0  0.0      0     0 ?        S<   Jun25   0:00 [watchdog/1]
root         8  0.0  0.0      0     0 ?        S<   Jun25   0:00 [events/0]
root         9  0.0  0.0      0     0 ?        S<   Jun25   0:00 [events/1]
root        10  0.0  0.0      0     0 ?        S<   Jun25   0:00 [khelper]
root        11  0.0  0.0      0     0 ?        S<   Jun25   0:00 [kthread]
root        15  0.0  0.0      0     0 ?        S<   Jun25   0:00 [kblockd/0]
root        16  0.0  0.0      0     0 ?        S<   Jun25   0:00 [kblockd/1]
root        17  0.0  0.0      0     0 ?        S<   Jun25   0:00 [kacpid]
root       120  0.0  0.0      0     0 ?        S<   Jun25   0:00 [cqueue/0]
……
root      9784  0.0  0.0   5456   956 pts/0    R+   10:23   0:00 ps -aux
在上面列表中列出的进程信息中包含了一些新的项,它们的含义是:
USER  启动进程的用户。
%CPU  运行该进程占用CPU的时间与该进程总的运行时间的比例。
%MEM  该进程占用内存和总内存的比例。
VSZ  虚拟内存的大小,以KB为.单位。
RSS  占用实际内存的大小,以KB为单位。
STAT  进程的运行状态,其中包括以下几种代码:
 D 不可中断的睡眠。
 R 执行。
 S 睡眠。
 T 跟踪或停止。
 Z 终止。
 w 没有内存驻留页。
 < 高优先权的进程。
 N 低优先权的进程。
 L 有锁入内存的页面(用于实时任务或UO任务)。
START  开始运行的时间。


kill命令
kill命令用来终止一个进程的运行。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

一般格式
kill [-s 信号 -p] [-a] 进程号…
kill -l [信号]

选项
-s 指定需要发送的信号,既可以是信号名(如kill),也可以是对应信号的号码(如9)。
-p 指定kill命令只是显示进程的PID(进程标志号),并不真正发出结束信号。
-l 显示信号名称列表,这也可以在/usr/include/linux/signal.h文件中找到。

注意
1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kin命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kiU向进程发送特定的信号。例如:
kill -2 123
它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。

2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。

3、可以向多个进程发信号或终止它们。

4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。

5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。

示例
一般可以用kill命令来终止一个己经挂死的进程或者一个陷入死循环的进程。首先执行以下命令:
# find / -name core -print>/dev/null 2>&1&
这是一条后台命令,执行时间较一长。其功能是:从根目录开始搜索名为core的文件,将结果输出(包括错误输出)都定向到/dev/null文件。现在决定终止该进程。为此,运行ps命令来查看该进程对应的PID。例如,该进程对应的PID是1651,现在可用垃l命令“杀死”这个进程:
#kill 1651
再用ps命令查看进程状态时,就可以看到,find进程已经不存在了。


sleep命令
sleep命令的功能是使进程暂停执行一段时间。“时间值”参数以秒为单位,即让进程暂停由时间值所指定的秒数。此命令大多用于shell程序设计中,使两条命令执行之间停顿指定的时间。

一般格式:sleep 时间值

示例:下面的命令行使进程先暂停100秒,然后查看用户abc是否在系统中:
#sleep 100;who | grep 'abc'

延伸阅读

评论