在使用linux的时候,进程管理是必须要掌握的技能,下面从几个方面介绍下进程管理相关知识点。
进程分类
- 前台进程:
该程序运行行,就占据了命令提示符;
- 后台进程:
启动之后,释放命令提示符,后续的操作在后台执行;
从前台到后台:
当使用Ctrl+z 后该进程会放到后台,并停止运行;
如果想让它在后台继续运行,则可以使用bg命令:
# bg job_id
这个job_id是使用jobs命令来查看的。每个放到后台的进程都有一个作业号。
[root@ns2 ~]# jobs
[1] + suspended sleep 3600
[root@ns2 ~]#
作业号:
+:有+号的表示命令默认操作的作业;
-:有-号的表示命令将第二个执行的操作;
把后台的进程拿到前台来执行:
# fg job_id
终止某个作业:
# kill %job_id //注意这里的这个%一定不能省;
进程状态
D:不可中断的睡眠,通常是I/0操作;
R:运行或就绪,在运行队列上;
S:可中断的睡眠,(等待一个事件的结束)
T:停止
Z:僵死
<:高优先级进程
N:低优先级进程
+:前台进程组中的进程(和终端相关的)
l:多线程进程
s:会话进程首进程
PS命令
ps - report a snapshot of the current processes 给当前进程生成一个快照;可以理解成process status
ps命令支持两种不同风格的参数,BSD和UNIX;
- BSD风格:不加-
[root@ns2 ~]# ps aux|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 10368 668 ? Ss 10:26 0:01 init [3]
root 2 0.0 0.0 0 0 ? S< 10:26 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN 10:26 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< 10:26 0:18 [events/0]
root 5 0.0 0.0 0 0 ? S< 10:26 0:00 [khelper]
root 10 0.0 0.0 0 0 ? S< 10:26 0:00 [kthread]
root 14 0.0 0.0 0 0 ? S< 10:26 0:00 [kblockd/0]
root 15 0.0 0.0 0 0 ? S< 10:26 0:00 [kacpid]
root 186 0.0 0.0 0 0 ? S< 10:26 0:00 [cqueue/0]
[root@ns2 ~]#
USER:表示运行此进程的用户
PID:表示此进程的进程号
%CPU:表示此进程占用CPU的百分比
%MEM:表示此进程占用内存的百分比
VSZ:此进程占用的虚拟内存大小,单位KB
virtual memory size of the process in KiB (1024-byte units). Device mAppings are currently excluded; this is subject to change.
RSS:此进程占用常住内存大小,不包括swapped的大小,也就是物理内存的大小,单位KB
resident set size, the non-swapped physical memory that a task has used (in kiloBytes).
TTY:表示此进程所属的终端,?表示不属于任何终端;
STAT:该进程的状态;
START:表示此进程的启动时间,
TIME 占用CPU的累积时长;
accumulated cpu time, user + system. The display format is usually "MMM:SS", but can be shifted to the right if the process used more than 999 minutes of cpu time.
COMMAND:是哪个命令启动的该进程,如果命令是被[]包起来的,则表示是内核进程;
- UNIX风格:必须加-
例如:ps -elf
-e Select all processes. Identical to -A 显示所有的进程,和-A选项是一样的,所以也可以写在:ps -Alf
-l long format. The -y option is often useful with this. 使用长行格式显示,
-f does full-format listing. This option can be combined with many other UNIX-style options to add additional columns.就是说使用比较全的格式来显示,这样可以显示更多的信息;
[root@ns2 ~]# ps -elf|head
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 75 0 - 2592 - 10:26 ? 00:00:01 init [3]
1 S root 2 1 0 -40 - - 0 migrat 10:26 ? 00:00:00 [migration/0]
1 S root 3 1 0 94 19 - 0 ksofti 10:26 ? 00:00:00 [ksoftirqd/0]
1 S root 4 1 0 70 -5 - 0 worker 10:26 ? 00:00:19 [events/0]
1 S root 5 1 0 70 -5 - 0 worker 10:26 ? 00:00:00 [khelper]
5 S root 10 1 0 74 -5 - 0 worker 10:26 ? 00:00:00 [kthread]
1 S root 14 10 0 70 -5 - 0 worker 10:26 ? 00:00:00 [kblockd/0]
1 S root 15 10 0 80 -5 - 0 worker 10:26 ? 00:00:00 [kacpid]
1 S root 186 10 0 77 -5 - 0 worker 10:26 ? 00:00:00 [cqueue/0]
[root@ns2 ~]#
-U|u :显示属于指定的用户名或用户UID的进程。-u:表示的是有效的UID,比如:当Jack用户正在执行passwd在修改自己的密码,那么此时,用pgrep -u jack passwd并不能看到,因为passwd是有SUID的,此时该进程的执行者已经是root了。如果使用-U就可以显示出jack;
-o 用户可以定义要显示的字段:ppid,pid,cmd,stat等
pgrep命令
pgrep patten
查找能够匹配pattern的进程的进程号
pgrep -u|U root pattern
查找属于root用户的进程,并且能够匹配pattern的进程的进程号. -u和-U的区别上ps的是一样的;
[root@ns2 ~]# pgrep bash
5822
6126
6345
[root@ns2 ~]# pgrep -u root bash
5822
6126
[root@ns2 ~]#
pstree命令:
pstree 以树状结构来显示进程信息;
top命令:
以动态的方式显示系统中的进程的相关信息:
[root@ns2 ~]# top -n 1
top - 23:49:36 up 13:23, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.4%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 507528k total, 424776k used, 82752k free, 43412k buffers
Swap: 1052248k total, 0k used, 1052248k free, 198940k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 15 0 10368 668 564 S 0.0 0.1 0:01.10 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
%wa wait 等待I/0所占用CPU时间的百分比;
%hi Hard Interruption CPU的硬中断;
%si Soft Interruption CPU的软中断;
%st 指的是被偷走的CPU的时间;
VIRT 表示虚拟内存swap的使用量,单位是KB;
RES 表示的是物理内存的使用量,单位是KB;
SHR 表示的是占用共享内存的大小,单位是KB。因为LINUX系统中有一个库是共享的,所以在内存中也是以共享内存的方式提供的,这样就避免了每个进程都要单独分一点内存来使用相同的库。
TIME+ 真正占用CPU的时间;
top中的交互命令:
1(数字):如果服务器有多个CPU,那当按1后,就会显示每个CPU的负载情况;
M:按物理内存的占用来排序;
P:按CPU占用来排序;
T:按占用CPU的时间来排序;
l (小写L):是否显示平均负载和启动时间那一行;
t:是否显示Tasks和CPU(s)状态那一行信息;
m:是否显示内存和SWAP使用情况的那两行;
c:是否显示完整的命令信息;
q:退出top
k:终止指定的进程,按下k后,会让用户输入一个进程的pid
> 表示向后翻页;
< 向前翻页;
-d number 表示让top刷新的时间;
-b 让top以一批一批地来显示;也就是一次显示全部进程的相关信息;
-n number 当top工作在批模式下时,-n表示让top显示多少批;
进程间通信的方式
1、共享内存:一个进程在这块共享内存中写入数据,另一个进程再去读这个数据;
2、使用信号;
3、使用semaphore
Linux中的信号种类:
查看当前系统中支持的信息有哪些,可以使用kill -l命令:
[root@ns2 ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@ns2 ~]#
其中几个最重要的是:
1:SIGHUP 让一个里程不用重启,就可以重新读取其配置文件,并让新的配置文件生效;
2:SIGINT 中断一个进程,和Ctrl+c的作用一样;
9:SIGKILL 杀死一个进程,直接关闭,不论是不是有打开的文件或是提供的服务;
15:SIGTERM 终止一个进程,如果该进程有打开的文件或是正在提供服务等,会等它这些操作都完成后,再关闭;(kill 的默认信号)
指定一个信号 :
- 使用信号号码:kill -1|2|9|15
- 使用信号名称:kill -SIGKILL
- 使用信号简写:kill -KILL
kill的用法:
# kill -9 pid
还有一个命令是killall,也可以和kill一样接受信号,只是killall后面接的是进程名称;
# killall [-9] httpd
调整进程的NICE值:
进程的nice命令代表的是进程的优先级:范围是-20~19,数字越小,优先级越高;
- 对于已经在运行的进程,那么可以使用renice命令
# renice 18 33098 //后面接的是进程的PID
- 对于还没有运行的程序,可以在其运行的时候使用nice来指定
# nice -n 10 tar zcf test.tgz /tmp
vmstat命令
vmstat 查看系统状态信息:
[root@ns2 ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 96616 53252 190240 0 0 63 9 1023 48 0 1 98 1 0
0 0 0 96616 53252 190240 0 0 0 0 1020 47 0 0 100 0 0
0 0 0 96616 53252 190264 0 0 0 0 994 28 0 0 100 0 0
0 0 0 96616 53252 190264 0 0 0 0 1010 48 0 2 98 0 0
0 0 0 96616 53252 190264 0 0 0 0 989 28 0 0 100 0 0
[root@ns2 ~]#
- procs:表示进程相关信息:
r:表示正在运行的进程队列长度;running
b:表示进程阻塞的队列长度; blocked
memory:表示和内存相关的信息:
swpd:表示内存中有多少个页面被交换到了交换分区;
free:空闲的内存页面数量;
buff:缓冲使用的页面数量;
cache:缓存使用的页面数量;
swap:显示和交换分区相关的信息:
si:有多个个内存页面被交换到了交换分区;
so:有多个交换分区的页面被交换到了内存;
io:和硬盘I/O相关:
bi:有多少个硬盘块被放到内存中;block in 这些方向都是相对于内存来说的
bo:有多少个硬盘块从内存同步到了硬盘中;block out
- system和系统相关:
in:表示有多少个中断;Interruption
cs:表示有多少次的上下文切换;也就是进程的轮换的到CPU上去执行一段时间; context switch
- CPU 和CPU相关的信息:
us:用户空间占用的百分比;
sy:内核空间占用的百分比;
id:系统空间百分比;
wa:等待I/O占用的百分比;
st:CPU被偷走的时间;