大家都知道在Windows下怎么使用任务管理器来管理进程,那么在Linux下呢?
今天我们一起认识一下如何在Linux系统中使用任务管理器管理进程,保证我们的Linux服务器运行的很流畅。
程序是保存在外部存储介质(如硬盘)中的可执行及其代码个数据的静态集合,而进程是在CPU及内存中处于动态执行状态的计算机程序。在Linux操作系统中,程序启动后可以创建一个或多个进程。
一、查看进程
了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的角度查看进程状态,常用查看进程的命令有:
(1)PS命令——查看静态的进程统计信息
ps命令是Linux操作系统中最为常用的进程查看工具,主要用于显示包含当前运行的各进程完整信息的静态快照,通过不同的命令选项,可以有选择地查看进程信息。
常用的参数有:
a:显示当前终端的所有进程消息,包括其他用户的进程。与“x”选项结合时可以显示系统中的所有进程信息;
u:使用以用户为主的格式显示输出进程信息;
x:显示当前用户在所有终端下的进程信息;
-e:显示系统中的所有进程信息;
-l:使用长格式显示进程信息;
-f:使用完整的格式显示进程信息。
注意,有一部分的选项不带“-”选项的,如果不小心加上可能会出现错误,详细使用情况可以参考man手册!
[root@localhost ~]# ps aux
//以简单列表的形式显示出进程信息
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.3 128092 6708 ? Ss 17:56 0:01 /usr/lib/sys
root 2 0.0 0.0 0 0 ? S 17:56 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 17:56 0:00 [ksoftirqd/0
root 6 0.0 0.0 0 0 ? S 17:56 0:00 [kworker/u25
root 7 0.0 0.0 0 0 ? S 17:56 0:00 [migration/0
root 8 0.0 0.0 0 0 ? S 17:56 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 17:56 0:00 [rcu_sched]
…………………… //省略部分内容
上述输出信息中,第一行为列表标题,其中各字段的含义描述如图:
[root@localhost ~]# ps -elf
//以长格式显示系统中的进程信息,并且包含更丰富的内容
//(包括对应进程的父进程的PID号)
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32023 ep_pol 17:56 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 17:56 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 17:56 ? 00:00:00 [ksoftirqd/0]
………… //省略部分内容
[root@localhost ~]# ps
PID TTY TIME CMD
2954 pts/0 00:00:00 bash
3298 pts/0 00:00:00 ps
//只显示当前用户会话中打开的进程
[root@localhost ~]# ps aux | grep bash
//由于系统中运行的进程数量较多,需要查询某一个进程的信息时
//可以结合管道操作和grep命令进行过滤
root 696 0.0 0.0 115248 936 ? S 17:56 0:00 /bin/bash /usr/sbin/ksmtuned
root 2666 0.0 0.1 116572 3392 tty2 Ss+ 17:57 0:00 -bash
root 2954 0.0 0.1 116432 3164 pts/0 Ss 17:58 0:00 -bash
root 3309 0.0 0.0 112664 972 pts/0 R+ 18:26 0:00 grep --color=auto bash
(2)top命令——显示进程动态信息
使用ps命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。若希望系统以动态刷新的方式显示各进程的状态信息,可以使用top命令。top命令将会在当前终端以全屏交互式的假面进行进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用基本类似于Windows操作系统中的任务管理器。
[root@localhost ~]# top
相关信息的含义:
在top命令的全屏操作界面中,可以
按“P”键根据CPU占用情况对进程列表进行排序;
按“M”键根据内存占用情况进行排序;
按“N”键根据启动时间进行排序;
按“h”键可以获得top程序的在线帮助信息;
按“q”键可以正常的退出top程序。
若通过top排名工具发现某个进程CPU占用了非常高,需要终止该进程的阳性,可以在top操作界面中按“k”键会出现“PID to signal/kill [default pid = 3513] ”的提示信息, 根据提示输入指定进程的PID好并按Enter键,出现“Send pid 3513 signal [15/sigterm] ”的二次确认信息,然后按Enter键确认即可终止对应的进程。
(3)pgrep命令——查询进程信息
当使用ps命令查询某个进程的PID信息是,往往需要结合grep命令对输出信息进行过滤,但这样使用非常不方便,而pgrep命令正是查询特定进程信息的专用工具。使用pgrep命令可以根据进程的名称,运行进程的用户、进程所在的终端等多种属性查询特定进程的PID号。
通过pgrep命令,可以只指定进程的一部分名称进行查询,结合“-l”选项可以同时输出对应的进程名(否则只输出PID好,不便于理解)。
[root@localhost ~]# pgrep -l "log"
//查询进程名中包含“log”的进程及其PID号
399 xfs-log/dm-0
592 xfs-log/sda1
642 abrt-watch-log
658 abrt-watch-log
661 systemd-logind
987 rsyslogd
2649 login
还可以结合“-U”选项查询特定用户的进程、“-t”选项查询在特定终端运行的进程。比如:
[root@localhost ~]# pgrep -l -U root -t tty2
//查询用户root在tty2终端上运行的进程及PID号
2666 bash
(4)pstree命令——查看进程树
pstree命令可以输出Linux操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父子进程)。
pstree命令默认情况只显示各进程的名称,可以结合以下选项:
-p:可以列出对应的PID号;
-u:可以列出对应的用户名;
-a:可以列出完整的命令信息。
[root@localhost ~]# pstree -aup
//查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息。
//输出结果可以看出,systemd进程确实实际Linux操作系统中所有进程的“始祖”。
systemd,1 --system --deserialize 26
├─ModemManager,678
│ ├─{ModemManager},718
│ └─{ModemManager},721
├─NetworkManager,746 --no-daemon
│ ├─{NetworkManager},758
│ └─{NetworkManager},761
………… //省略部分内容
[root@localhost ~]# pstree -ap xiaoli
bash,43888
└─vim,44047 123.txt
//查看只属于用户xiaoli的进程树结构
二、控制进程
(1)启动进程
在Linux操作系统中,可以由用户手工启动或者按预定计划调度启动新的进程。
1)手工启动进程
由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。
进程子啊前台运行(如执行“ls -l”命令)是,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台执行运行。进程在后台运行时,用户可以据需在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。
启动后台进程需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。
[root@localhost ~]# cp /dev/cdrom /a &
//复制系统光盘(内容较多,耗时较长,建议放到后台运行)
1] 44271
//输出信息中华包括后台任务序号、PID号
2)调度启动进程
在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份)这些任务更适合在相对空闲的时候(如夜间)进行。这是就需要用户实现进行调度安排,指定任务运行的时间,当系统达到设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。
进度的调度启动可以通过at、crontab命令进行设置,其中at命令用于设置一次性计划任务;crontab命令用于设置周期性运行。关于at命令、crontab命令可以参考博文:Linux系统计划任务管理详解
(2)改变进程的运行方式
1)挂起当前的进程
当Linux操作系统中的命令正在前台执行时(尚未结束),按ctrl+z组合键可以将当前进程挂起(调入后台并停止执行),这种操作需要暂停当前进程并进行其他操作时特别有用。比如:
[root@localhost ~]# cp /dev/cdrom mycd.iso
^Z
[1]+ 已停止 cp -i /dev/cdrom mycd.iso
2)查看后台的进程
需要查看当前终端中在后台运行的进程任务是,可以使用“jobs”命令,结合“-l”选型可以同时显示该进程对应的PID号。在jobs命令的树池结果中,每一行记录对应一个后台进程的状态信息,行首的数字表示该进程在后台的任务编号。若当前终端没有后台进程,将不会显示人任何信息。比如:
[root@localhost ~]# jobs -l
[1]+ 44487 停止 cp -i /dev/cdrom mycd.iso
3)将后台的进程恢复运行
使用“bg”命令,可以将后台中暂停执行(如按ctrl+z组合键挂起)的任务恢复运行,继续在后台执行操作,而使用“fg”命令可以将后台任务重新恢复到前台运行。
除非后台中的任务只有一个,否则bg和fg命令都需要指定后台进程的任务编号作为参数。
[root@localhost ~]# fg 1
cp -i /dev/cdrom mycd.iso
//在前台占用终端
[root@localhost ~]# jobs -l
[1]+ 44601 停止 cp -i /dev/cdrom mycd.iso
[root@localhost ~]# bg 1
//放入后台运行
[1]+ cp -i /dev/cdrom mycd.iso &
[root@localhost ~]# jobs -l
[1]+ 44601 运行中 cp -i /dev/cdrom mycd.iso &
(3)终止进程执行
当用户在前台执行某个进程时,可以按ctrl+c组合键强制进行中断。中断前台进程的运行后,系统将返回命令行提示符等待用户输入新的命令。(如果ctrl+c组合键无法终止程序时,可以使用专用的进程终止工具kill、killall和pkill)。
1)使用kill命令终止进程
通过kill命令终止进程时,需要使用进程的PID号作为参数。无特定选项时,kill命令将给该进程发送终止信号并正常退出运行。
kill指令常用的选项,如图:
比如:
[root@localhost ~]# pgrep -l "sshd"
//查询目标进程的PID号
1263 sshd
44415 sshd
[root@localhost ~]# kill 1263
[root@localhost ~]# kill 44415
//终止指定PID的进程
[root@localhost ~]# pgrep -l "sshd"
//确认进程已终止
对于无法正常终止的系统进程,在必要时可以结合“-9”选项强制终止(强制终止可能会导致数据丢失等情况,一般情况不建议使用),比如:
[root@localhost ~]# vim 123.txt //打开vim程序并挂起作为测试
[1]+ 已停止 vim 123.txt
[root@localhost ~]# jobs -l //查询目标进程的PID号
[1]+ 45874 停止 vim 123.txt
[root@localhost ~]# kill 45874 //尝试正常结束进程
[root@localhost ~]# jobs -l //但发现vim进程并未退出
[1]+ 45874 停止 vim 123.txt
[root@localhost ~]# kill -9 45874 //强制终止目标进程
[root@localhost ~]# jobs -l //测试效果(进程已死)
[1]+ 45874 已杀死 vim 123.txt
2)使用killall命令终止进程
使用killall命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便、效率更高,killall命令同样也有“-9”选项。
[root@localhost ~]# vim 123 //挂起第一个vim测试进程
[1]+ 已停止 vim 123
[root@localhost ~]# vim 1234 //挂起第二个vim测试进程
[2]+ 已停止 vim 1234
[root@localhost ~]# jobs -l //确认带终止的进程信息
[1]- 45922 停止 vim 123
[2]+ 45923 停止 vim 1234
[root@localhost ~]# killall -9 vim //通过进程名终止多个进程
[1]- 已杀死 vim 123
[2]+ 已杀死 vim 1234
[root@localhost ~]# jobs -l //确认效果
3)使用pkill命令终止进程
使用pkill命令可以根据进程的名称,运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“-t”(指定终端)等选项。使用起来非常方便。比如:
[root@localhost ~]# pgrep -l -U "xiaoli" //确认目标进程相关信息
43888 bash
[root@localhost ~]# pkill -9 -U "xiaoli" //强行终止用户xiaoli的进程
[root@localhost ~]# pgrep -l -U "xiaoli" //确认目标进程已被终止
三、扩展指令
(1)free指令:观察内存使用情况;
常用的选项,如图:
比如:
Mem那一行表示显示的是实体内存的量;
Swap那一行表示内存交换空间的量;
total:总量;
used:一使用量;
free:剩余可用量;
shared buff/cache:是在已被使用的量中,用来作为缓冲及高速缓存的量;
(2)uname指令:查阅系统和核心相关信息;
常用的选项与参数,如图:
(3)netstat指令:追踪网络与插槽;
常用的选项,如图:
(4)vmstat指令:侦测系统资源变化;
常用的选项,如图:
比如:
程序字段 ( procs ) 的项目分别为:
r :等待运行中的程序数量;
b :不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。
内存字段 ( memory ) 项目分别为:
swpd :虚拟内存被使用的容量;
free :未被使用的内存容量;
buff :用于缓冲内存;
cache :用于高速缓存内存。 这部份则与free 是相同的;
内存交换空间 ( swap ) 的项目分别为:
si :由磁盘中将程序取出的量;
so :由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so的数值太大,表示内存内的数据常常得在磁盘与内存之间传来传去,系统性能会很差!
磁盘读写 ( io ) 的项目分别为:
bi :由磁盘读入的区块数量;
bo :写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
系统 ( system ) 的项目分别为:
in :每秒被中断的程序次数;
cs :每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时间钟等。
CPU 的项目分别为:
us :非核心层的 CPU 使用状态;
sy :核心层所使用的 CPU 状态;
id :闲置的状态;
wa :等待 I/O 所耗费的 CPU 状态;
st :被虚拟机 ( virtual machine ) 所盗用的 CPU 使用状态 ( 2.6.11 以后才支持)。
———————— 本文至此结束,感谢阅读 ————————