Linux 服务器正常启动后,提供服务时会调用程序,占用进程。这时候我们如何查看系统中有哪些进程在被调用呢?我们可以通过以下命令来查看。
一、ps 命令
ps 命令是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和它所运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等。总之大部分信息都是可以通过执行该命令得到的。ps 命令最常用来监控后台进程的工作情况,因为后台进程是不和屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测后台情况,就需要使用 ps 命令了。它的格式如下所示:格式:ps 〔选项〕其主要选项如下。
-a:显示系统中所有进程的信息。
-e:显示所有进程的信息。
-f:显示进程的所有信息。
-l:以长格式显示进程信息。
-r:只显示正在运行的进程。
-u:显示面向用户的格式(包括用户名、CPU 及内存的使用情况等信息)。
-x:显示所有非控制终端上的进程信息。
-p:显示由进程 ID 指定的进程信息。
-t:显示指定终端上的进程信息。
要对进程进行监测和控制,首先要了解当前进程的情况,当然也就需要查看当前进程的状态了。通过 ps 命令查看进程,根据所显示的信息可以了解哪个进程正在运行、哪个进程被挂起了、进程已运行了多久、进程正在使用的资源、进程的相对优先级,以及进程的标志号(PID)。所有这些信息对用户都很有用,对于系统管理员来说尤为重要。使用 ps -aux 命令可以获得终端上所有用户的有关进程的所有信息,这个也是我们平时用得最多的命令之一,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@localhost ~]# ps -aux | more
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 10348 580 ? Ss Jan23 0:07 init [5]
root 2 0.0 0.0 0 0 ? S< Jan23 0:01 [migration/0]
root 3 0.0 0.0 0 0 ? SN Jan23 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< Jan23 0:00 [watchdog/0]
root 5 0.0 0.0 0 0 ? S< Jan23 0:01 [migration/1]
root 6 0.0 0.0 0 0 ? SN Jan23 0:00 [ksoftirqd/1]
root 7 0.0 0.0 0 0 ? S< Jan23 0:00 [watchdog/1]
root 8 0.0 0.0 0 0 ? S< Jan23 0:00 [migration/2]
root 9 0.0 0.0 0 0 ? SN Jan23 0:00 [ksoftirqd/2]
root 10 0.0 0.0 0 0 ? S< Jan23 0:00 [watchdog/2]
root 11 0.0 0.0 0 0 ? S< Jan23 0:00 [migration/3]
....
|
USER:表示启动进程的用户。
PID:表示进程标志号。
%CPU:表示运行该进程占用 CPU 的时间与该进程总的运行时间之比。
%MEM:表示该进程占用内存与总内存之比。
VSZ:表示占用的虚拟内存大小,以 KB 为单位。
RSS:为进程占用的物理内存值,以 KB 为单位。
TTY:表示该进程建立时所对应的终端,“?”表示该进程不占用终端。
STAT:表示进程的运行状态。包括以下几种代码:D,不可中断的睡眠;R,就绪(在可运行队列中);S,睡眠;T,被跟踪或停止;Z,终止(僵死)的进程,这些进程不存在,但暂时无法消除;W,没有足够的内存分页可分配;<,高优先级的进程;N,低优先级的进程;L,有内存分页分配并锁在内存体内(实时系统或 I/O)。
START:为进程开始时间。
TIME:为执行的时间。
COMMAND:是对应的命令名。
由于 ps 执行后结果太多了,所以我们一般会带上 grep 参数来精确定位我们需要的进程号。例如,我们要查看 Nginx 占用的进程,可以用命令 ps -axugrep nginx,如下所示:
1
2
3
4
5
6
7
8
9
10
11
|
〔root@localhost ~〕# ps -axu| grep -v grep| grep nginx
Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.7/FAQ
root 4342 0.0 0.0 41096 896 ?Ss Mar16 0:00 nginx: master process /usr/local/webserver/nginx/sbin/nginx
www 4343 0.0 0.6 65920 26232 ?SMar16 0:05 nginx: worker process
www 4344 0.0 0.6 65920 26160 ?SMar16 0:02 nginx: worker process
www 4345 0.0 0.6 66076 26460 ?SMar16 0:03 nginx: worker process
www 4346 0.0 0.6 65920 26104 ?SMar16 0:03 nginx: worker process
www 4347 0.0 0.6 66052 26228 ?SMar16 0:04 nginx: worker process
www 4348 0.0 0.6 66012 26372 ?SMar16 0:04 nginx: worker process
www 4349 0.0 0.6 65788 26076 ?SMar16 0:03 nginx: worker process
www 4350 0.0 0.6 65920 26188 ?SMar16 0:06 nginx: worker process
|
二、top 命令
top 命令可动态显示服务器的进程信息。top 命令和 ps 命令的基本作用是相同的,都显示系统当前进程的状况。但 top 是一个动态显示过程,即用户可以通过按键来不断刷新当前状态。此命令的使用举例如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
top - 11:22:52 up 90 days, 1:18, 1 user, load average: 1.06, 1.18, 1.08
Tasks: 506 total, 1 running, 504 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.9%us, 0.2%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.6%si, 0.0%st
Mem: 8171912k total, 6772308k used, 1399604k free, 387668k buffers
Swap: 16385256k total, 52964k used, 16332292k free, 2112540k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17700 root 19 0 3205m 2.0g 16m S 9.3 25.9 1362:18 java
3772 root 20 0 3878m 1.1g 9128 S 5.6 14.1 62:24.67 java
15019 root 15 0 13004 1424 804 R 0.7 0.0 0:00.58 top
4499 root 15 0 0 0 0 S 0.3 0.0 10:25.90 nfsd
4503 root 15 0 0 0 0 S 0.3 0.0 10:15.94 nfsd
14018 daemon 15 0 5156 1948 1052 S 0.3 0.0 0:00.06 httpd
1 root 15 0 10348 580 548 S 0.0 0.0 0:07.59 init
2 root RT -5 0 0 0 S 0.0 0.0 0:01.25 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.32 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root RT -5 0 0 0 S 0.0 0.0 0:01.26 migration/1
6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
8 root RT -5 0 0 0 S 0.0 0.0 0:00.25 migration/2
9 root 34 19 0 0 0 S 0.0 0.0 0:00.32 ksoftirqd/2
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2
11 root RT -5 0 0 0 S 0.0 0.0 0:00.23 migration/3
12 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/3
13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3
14 root RT -5 0 0 0 S 0.0 0.0 0:00.20 migration/4
15 root 34 19 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd/4
.....
|
第一行内容依次表示当前时间、系统启动的时间、当前系统登录的用户数、平均负载。第二行依次显示的是所有启动的、目前运行的、挂起(Sleeping)的和无用(Zombie)的进程。第三行显示的是目前 CPU 的使用情况,包括系统占用的比例、用户使用比例、闲置(Idle)比例。第四行显示物理内存的使用情况,包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区的使用情况,包括总的交换分区、使用的、空闲的和用于高速缓存的交换分区。第六行显示的内容最多,下面分别进行详细解释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
PID(Process ID):进程标志号,是非零正整数。
USER:进程所有者的用户名。
PR:进程的优先级别。
NI:进程的优先级别数值。
VIRT:进程占用的虚拟内存值。
RES:进程占用的物理内存值。
SHR:进程使用的共享内存值。
STAT:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
%CPU:该进程占用的CPU使用率。
%MEM:该进程占用的物理内存和总内存的百分比。
TIME:该进程启动后占用的总CPU时间。
COMMAND:进程启动的启动命令名称,如果这一行显示不下,在进程中会有一个完整的命令行。
|
在 top 命令使用过程中,还可以使用一些交互的命令来完成其他参数的功能。这些命令是通过快捷键启动的,格式如下所示:<空格>:立刻刷新其主要参数如下所示。
1
2
3
4
5
6
7
8
|
P:根据CPU使用的多少进行排序。
T:根据时间、累计时间排序。
q:退出top命令。
m:切换显示内存信息。
t:切换显示进程和CPU状态信息。
c:切换显示命令名称和完整命令行。
M:根据使用内存的大小进行排序。
W:将当前设置写入~/.toprc文件中,这是写top配置文件的推荐方法。
|
三、pgrep 命令
pgrep 命令的作用是查找当前运行的进程,并列出匹配给定条件进程的 PID。所有的条件都必须匹配才会被列出。使用权限为所有用户。
以下是我在一台 64 位 FreeBSD8.1 x86_64 的机器上以用户名 andrewyu 查看的 ngnix 的所有进程号。
1
2
3
4
5
6
7
8
9
10
|
[root@loalhost ~]#pgrep nginx
2834
2833
2832
2831
2830
2828
2827
2826
2825
|
四、kill 命令
kill 命令的作用是终止一个进程。其格式如下:
- kill 〔-s signal |-p〕 〔-a〕pid…
- kill -l 〔 signal 〕
它的主要选项如下所示。
-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要终止的进程的 ID 号。
signal:表示信号。
kill 可将指定的信息送至程序中。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,则可以使用 SIGKILL(9)信息尝试强制删除程序。kill 命令的工作原理是,向 Linux 系统的内核发送一个系统操作信号和某个程序的进程标志号,然后系统内核就可以对进程标志号指定的进程进行操作了。当需要中断一个前台进程的时候,通常使用 Ctrl+C 组合键;但是对于一个后台进程来说,就不是一个组合键所能解决的了,这时就必须使用 kill 命令。另外,kill -9 可以强制杀掉进程,尤其适用于僵尸进程。
五、killall 命令
killall 命令的作用是通过程序的名字,直接杀死所有进程,这里简单介绍一下。如果要杀掉 nginx 的所有进程,要是用 kill 的话就要执行 9 次,但如果用 killall nginx 则能很轻松地一次性解决问题。另外,大家有兴趣也可以了解一下 pkill 的用法,在服务器里用它来“踢人”还是很方便的,这个命令在工作中我们用得不多,大家稍微了解一下即可。
在 Linux 下,最强大的进程管理命令莫过于 ps 和 top 了,我们应该掌握它们的详细语法,在工作中灵活地使用它们。
注:以上内容整理自《构建高可用的 Linux 服务器》一书。