进程管理
由于Linux是个多用户系统,有时候也要了解其他用户现在在干什么;同时Linux是一个多进程系统,经常需要对这些进程进行一些调配和管理;而要进行管理,首先就要知道现在的进程情况:究竟有哪些进程?进程情况如何?所以需要查看进程。
1.who命令
该命令主要用于查看当前线上的用户情况。这个命令非常有用。如果用户想和其他用户创建即时通信,比如使用talk命令,那么首先要确定的就是该用户确实上线,不然talk进程就无法创建起来。又如,系统管理员希望监视每个登录的用户此时此刻的行为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
2.w命令
该命令也用于显示登录到系统的用户情况,但是与who不同的是,w命令功能更加强大,它不但可以显示有谁登录到系统,还可以显示出这些用户当前正在进行的工作,并且统计资料相对who命令来说更加详细和科学。可以认为w命令就是who命令的一个增强版。w命令的显示项目按以下顺序排列:当前时间;系统启动到现在的时间;登录用户的数目;系统在最近1秒、5秒和15秒的平均负载。然后是每个用户的各项资料,项目显示顺序如下:登录账号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。其中JCPU时间指的是和该终端(tty)连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间。而PCPU时间则是指当前进程(即在WHAT项中显示的进程)所占用的时间。
3.ps命令
ps命令就是最基本的同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行以及运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都可以通过执行该命令得到。
ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。
ps [选项]
下面对命令选项进行说明 ∶
-e 显示所有进程。
-f 全格式。
-h 不显示标题。
-l 长格式。
-w 宽输出。
a 显示终端上的所有进程,包括其他用户的进程。
r 只显示正在运行的进程。
x 显示没有控制终端的进程。
O[+|-] k1 [, [+|-] k2 [, …]] 根据SHORT KEYS, k1, k2中快捷键指定的多级排序顺序显示进程列表。对于ps的不同格式都存在着默认的顺序指定。这些默认顺序可以被用户的指定所覆盖。其中 + 字符是可选的,- 字符是倒转指定键的方向。
最常用的3个参数是u, a, x。
下面是命令
#ps axu
的输出格式:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER:进程所有者。
PID:进程号。
%CPU:占用的 CPU 使用率。
%MEM:占用的内存使用率。
VSZ:占用的虚拟内存大小。
RSS:占用的内存大小。
TTY:终端的次设备号码。
STAT:该进程的状态。
D:不可中断的休眠(通常表示该进程正在进行I/O动作)。
R:正在执行中。
S:休眠状态。
T:暂停执行。
Z:不存在但暂时无法消除。
W:没有足够的内存分页可分配。
<:高优先顺序的进程。
N:低优先顺序的进程。
L:有内存分页分配并锁在内存内(即时系统或定制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]
4.top命令
top命令和ps命令的基本作用是相同的,用于显示系统当前的进程和其他状况。但是top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。准确地说,top命令提供了即时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用。内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过互动式命令或者在个人定制文件中进行设置。
下面是该命令的语法格式:
top [-] [d delay] [q] [c] [s] [S] [i]
其中:
d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变它。
q 该选项将使top没有任何延迟地进行刷新。如果调用程序有超级用户许可权,那么top将以尽可能高的优先顺序运行。
S 指定累计模式。
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名。
top命令显示的项目很多,默认值是每5秒刷新一次,当然这是可以设置的。
显示的各项目为:uptime项显示的是系统启动时间、已经运行的时间和3个平均负载值(最近1秒、5秒、15秒的负载值)。processes表示自最近一次刷新以来的运行进程总数。当然这些进程被分为正在运行的、休眠的、停止的等很多种类。进程和状态显示可以通过交互命令t来实现。
CPU states用于显示用户模式、系统模式、优先顺序进程(只有优先顺序为负的列入考虑)和闲置等各种情况所占用CPU时间的百分比。优先顺序进程所消耗的时间也被列入到用户和系统的时间中,所以总的百分比将大于100%。
Mem为内存使用情况统计,其中包括总的可用内存、空闲内存、已用内存、共用内存和缓存所占内存的情况。
Swap为交换空间统计,其中包括总的交换空间、可用交换空间、已用交换空间。
PID 每个进程的ID。
PPID 每个进程的父进程ID。
UID 每个进程所有者的UID 。
USER 每个进程所有者的用户名。
PRI 每个进程的优先顺序别。
NI 该进程的优先顺序值。
SIZE 该进程的代码大小加上资料大小再加上堆叠空间大小的总数,单位是KB。
TSIZE 该进程的代码大小。对于内核进程这是一个很奇怪的值。
DSIZE 资料和堆叠的大小。
TRS 文本驻留大小。
D 被标记为“不干净”的页项目。
LIB 使用的库页的大小。对于ELF进程没有作用。
RSS 该进程占用的实体内存的总数量,单位是KB。
SHARE 该进程使用共用内存的数量。
STAT 该进程的状态。其中,S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态。
TIME 该进程自启动以来所占用的总CPU时间。如果进入的是累计模式,那么该时间还包括这个进程子进程所占用的时间。且标题会变成CTIME。
%CPU 该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。
%MEM 该进程占用的实体内存占总内存的百分比。
COMMAND 该进程的命令名称,如果一行显示不下,则会进行截取。内存中的进程会有一个完整的命令行。
下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被遮掉。
<空格> 立即刷新显示。
Ctrl+L 擦除并且重写屏幕。
h或者? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程的信号。一般的终止进程可以使用信号15;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被遮罩。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先顺序。系统提示用户输入需要改变的进程PID以及需要设置的进程优先顺序值。输入一个正值将使优先顺序降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成ms。输入0则系统将不断刷新,默认值是5s。需要注意的是,如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
从上面的介绍中可以看到,top命令是一个功能十分强大的监控系统工具,尤其对于系统管理员而言更是如此。一般的用户可能会觉得ps命令其实就够用了,但是top命令的强劲功能确实提供了不少方便。下面来看看实际使用的情况。
例:键入top命令查看系统状况,如图9-4所示。
|
第1行的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第2行为进程情况,依次为进程总数、休眠进程数、运行进程数、僵死进程数、终止进程数。第3行为CPU状态,依次为用户占用、系统占用、优先进程占用、闲置进程占用。第4行为内存状态,依次为平均可用内存、已用内存、空闲内存、共用内存、缓存使用内存。第5行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、快取内存容量。接下来就是和ps相仿的各进程情况列表了。
5.Kill命令
当需要中断一个前台进程的时候,通常是使用组合键【Ctrl+C】;但是对于一个后台进程恐怕就不是一个组合键所能解决的了,这时就必须求助于kill命令。该命令可以终止后台进程。终止后台进程的原因很多,或许是该进程占用的CPU时间过,或许是该进程已经挂死。总之这种情况是经常发生的。
kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送信号,那么默认值为TERM信号,它将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用kill(9)信号了,该信号是不能被捕捉的。
kill命令的语法格式很简单,大致有以下两种方式:
kill [-s 信号 | -p ] [ -a ] 进程号 ...
kill -l [信号]
其中,
-s 指定需要送出的信号,既可以是信号名也可以是对应数位。
-p 指定kill命令只是显示进程的pid,并不真正送出结束信号。
-l 显示信号名称列表,这也可以在/usr/include/Linux/signal.h文件中找到。
下面看看该命令的使用。
例在执行一条find命令时由于时间过长,决定终止该进程。
首先应该使用ps命令来查看该进程对应的PID。键入ps,显示如下:
PID TTY TIME COMMAND
285 1 00:00:00 -bash
287 3 00:00:00 -bash
289 5 00:00:00 /sbin/mingetty tty5
290 6 00:00:00 /sbin/mingetty tty6
312 3 00:00:00 telnet bbs3
341 4 00:00:00 /sbin/mingetty tty4
345 1 00:00:00 find / -name foxy.jpg
348 1 00:00:00 ps
可以看到,该进程对应的PID是345,现在使用kill命令来终止该进程。键入:
# kill 345
再用ps命令查看,就可以看到,find进程已经被终止了。
例:杀掉进程11721。
# ps
PID TTY TIME COMMAND
11668 p1 00:00:00 -tcsh
11721 p1 00:00:00 cat
11737 p1 00:00:00 ps
# kill 11721
[1] Terminated cat
有时候可能会遇到这样的情况,某个进程已经挂起或闲置,使用kill命令却终止不掉。这时候就必须发送信号9,强行关闭此进程。当然这种“野蛮”的方法很可能会导致打开的文件出现错误或者资料丢失。所以不到万不得已的时候不要使用强制结束的办法。如果连信号9都不回应,那恐怕就只有重新启动电脑了。
表9-1所示为Linux所有的信号。
讯 号 | 描 述 |
SIGABRT | 处理退出信号 |
SIGALRM | 报警时钟 |
SIGFPE | 错误的算术操作 |
SIGHUP | 挂起 |
SIGILL | 非法命令 |
SIGINT | 中断信号 |
SIGKILL | Kill (不能忽略) |
SIGPIPE | 向管道写,没有程序读 |
SIGQUIT | 退出信号 |
SIGSEGV | 非法内存引用 |
SIGTERM | 终止信号 |
SIGUSR1 | 用户定义信号1 |
SIGUSR2 | 用户定义信号2 |
SIGCHLD | 子进程终止或停止 |
SIGCONT | 如果停止,继续执行 |
SIGSTOP | 停止执行(不能忽略) |
SIGTSTP | 停止信号 |
SIGTTIN | 后台进程尝试读 |
SIGTTOU | 后台进程尝试写 |
SIGBUS | 汇流排错误 |
SIGPOLL | Pollable event |
SIGPROF | 剖析计时器到时 |
SIGSYS | 非法系统调用 |
SIGTRAP | 跟踪/中断点陷阱 |
SIGURG | 在 socket 中高频宽资料可用 |
SIGVTALRM | 虚拟计时器到时 |
SIGXCPU | 超过CPU时间限制 |
SIGXFSZ | 超过文件大小限制 |
6.nohup命令
理论上,我们一般退出Linux系统时会把所有的程序全部结束,包括那些后台程序。有些时候,例如你正在编辑一个很长的程序,但是你下班或是有事需要先退出系统,你又不希望系统把你编辑那么久的程序结束,希望退出系统时,程序还能继续执行。这时,我们就可以使用nohup命令使进程在用户退出后仍继续执行。
一般我们都是让这些进程在后台执行,结果会写到用户自己目录下的nohup.out文件里(也可以使用输出重定向,让它输出到一个特定的文件)。
例如:
# nohup sort sales.dat &
这条命令告诉sort命令忽略用户已退出系统,它应该一直运行,直到进程完成。利用这种方法,可以启动一个要运行几天甚至几周的进程,而且在它运行时,用户不需要去登录。
nohup命令把一条命令的所有输出和错误信息送到nohup.out文件中。若将输出重定向,则只有错误信息放在nohup.out文件中。