Linux操作系统系列之进程管理


烈火网教程:Linux 的进程管理手段可比 Windows 强大多了,而且所有的进程都映射到 /proc 目录中,我们可以像操作普通文件那样查看这些进程的内存数据。

~$ ls -l /proc

dr-xr-xr-x 7 root root 0 2009-08-05 16:28 1
... ...
-r--r--r-- 1 root root 0 2009-08-08 22:55 version
-r--r--r-- 1 root root 0 2009-08-08 22:55 version_signature
-r-------- 1 root root 0 2009-08-08 22:55 vmallocinfo
-r--r--r-- 1 root root 0 2009-08-05 16:29 vmstat
-r--r--r-- 1 root root 0 2009-08-08 22:55 zoneinfo

~$ cat /proc/version
Linux version 2.6.28-11-generic (buildd@palmer) (gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) ) #42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009

1. 作业管理

通过 "&" 将命令放在 "后台" 执行

~$ nano a.txt & # 后台执行 nano 编辑器

[1] 12988

[1]+ Stopped nano a.txt

~$ jobs # 查看当前所有执行的作业

[1]+ Stopped nano a.txt

~$ fg 1 # 将 1 作业调到前台执行

按 Ctrl + Z 键可以将正在执行的程序放到后台。对于 "Stopped" 状态的后台程序,我们可以用 "bg" 让其在后台 "Running"。

~$ sleep 1m # 休眠 1 分钟,并用 Ctrl + Z 让其在后台执行。

^Z
[1]+ Stopped sleep 1m

~$ jobs

[1]+ Stopped sleep 1m # sleep 命令被 "挂起"。

~$ bg 1 # 使用 fg 让 sleep 在后台执行。

[1]+ sleep 1m &

~$ jobs

[1]+ Running sleep 1m &

我们可以用 "kill" 命令终止作业。

~$ jobs

[1]+ Stopped sleep 1m

~$ kill -9 %1

[1]+ Stopped sleep 1m

~$ jobs

[1]+ Killed sleep 1m

kill 有几个主要的参数: -1 reload; -2 Ctrl + C; -9 强制删除; -15 以正常方式退出。

2. 进程管理

"ps" 用于查看当前运行的进程,参数很多,不过常用的就是 "aux"。

~$ ps aux | more

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 3084 1884 ? Ss 08:00 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S< 08:00 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< 08:00 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< 08:00 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 08:00 0:00 [watchdog/0]
root 6 0.0 0.0 0 0 ? S< 08:00 0:00 [events/0]
root 7 0.0 0.0 0 0 ? S< 08:00 0:00 [khelper]
root 8 0.0 0.0 0 0 ? S< 08:00 0:00 [kstop/0]
root 9 0.0 0.0 0 0 ? S< 08:00 0:00 [kintegrityd/0]
root 10 0.0 0.0 0 0 ? S< 08:00 0:00 [kblockd/0]
root 11 0.0 0.0 0 0 ? S< 08:00 0:00 [kacpid]
root 12 0.0 0.0 0 0 ? S< 08:00 0:00 [kacpi_notify]
...

显示结果列:
USER: 用户账号
PID: 进程编号
%CPU: CPU 占用百分比
%MEM: 内存占用百分比
VSZ: 虚拟内存占用量
RSS: 固定内存占用
TTY: 终端
STAT: 运行状态 (R: 运行; S: 睡眠; T: 终止; Z: 某种原因造成的僵尸进程)
START: 启动时间
TIME: CPU 运行时间
COMMAND: 命令行
我们还可以直接查看单个进程。

~$ ps 34

PID TTY STAT TIME COMMAND
34 ? S< 0:00 [kmpath_handlerd]

~$ ps -C ksnapd

PID TTY TIME CMD
35 ? 00:00:00 ksnapd

和 ps 静态输出不同,"top" 可以动态刷新进程信息(默认刷新间隔为 5 秒)。

~$ top

top - 12:02:29 up 4:02, 2 users, load average: 0.04, 0.04, 0.01
Tasks: 113 total, 1 running, 111 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.2%us, 1.3%sy, 0.2%ni, 97.6%id, 0.6%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 509504k total, 436672k used, 72832k free, 79376k buffers
Swap: 409616k total, 0k used, 409616k free, 212208k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14 root 15 -5 0 0 0 S 1.9 0.0 0:11.08 ata/0
1 root 20 0 3084 1884 564 S 0.0 0.4 0:02.43 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:00.33 ksoftirqd/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

第一行: 系统已启动时间; 在线用户数; 系统 1、5、10 分钟的负载 (通常不超过 1,如果持续大于 5 则需要检查)。
第二行: 进程统计。zombie 表示僵尸进程数量。
第三行: CPU 负载统计。
第四行: 内存使用统计。
第五行: 虚拟内存使用统计。

进程列信息:
PID: 进程编号
USER: 用户账号
PR: 优先级 (越小越早执行)
NI: Nice
%CPU: CPU 占用百分比
%MEM: 内存占用百分比
TIME+: CPU 运行时间
COMMAND: 命令行
我们可以用 "-d" 参数指定刷新频率 (秒)

~$ top -d 1

"-p" 参数用于指定某个具体的进程编号。

~$ top -d 1 -p 13952

运行时可以按 "h" 进入帮助菜单,查看显示和排序等快捷键。

3. 进程优先级

每个进程都有一个 "优先级 (Priority)" 属性,系统按照优先级 (升序)来安排执行次序。

PRI (new) = PRI (old) + Nice

由于 PRI 是由系统 "动态" 决定的,因此我们要调整优先级,需要通过 Nice 来完成。

~$ nano &

[1] 15174

[1]+ Stopped nano

~$ ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 1000 15086 15082 0 80 0 - 1447 - pts/0 00:00:00 bash
0 T 1000 15174 15086 0 80 0 - 929 signal pts/0 00:00:00 nano
0 R 1000 15177 15086 0 80 0 - 635 - pts/0 00:00:00 ps

~$ sudo renice -5 15174 # 调整优先级

15174: old priority 0, new priority -5

~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 1000 15086 15082 0 80 0 - 1447 - pts/0 00:00:00 bash
0 T 1000 15174 15086 0 75 -5 - 929 signal pts/0 00:00:00 nano
0 R 1000 15182 15086 0 80 0 - 635 - pts/0 00:00:00 ps

相关内容