文章目录
前言
众所周知,Windows系统是有任务管理器的,我们可以通过任务管理器来结束不需要的进程。而Linux系统中的进程就相当于Windows的任务管理器,只不过进程是需要用命令来管理的。
一、程序和进程
1.程序
-
程序是保存在硬盘、光盘等介质中的可执行代码和数据
-
它是静态保存的代码
2.进程
- 进程是在CPU及内存中处于动态执行状态的计算机程序
- 每个程序启动后可以创建一个或多个进程
3.进程和线程的区别
- 一个程序至少有一个进程,一个进程至少有一个线程。
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
- 他们的优缺点在于:
线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
二、查看进程
了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的角度查看进程状态。
1. 查看静态的进程统计信息(ps)
ps命令是Linux系统中最为常用的进程查看工具,主要用于查看静态的进程统计信息。通过不同的命令选项,可以有选择性的查看进程信息。
- 常用选项
选项 | 说明 |
---|---|
-a | 显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。 |
-u | 使用以用户为主的格式输出进程信息 |
-x | 显示当前用户在所有终端下的进程信息 |
-e | 显示系统内的所有进程信息 |
-l | 使用长格式显示进程信息 |
-f | 使用完整的格式显示进程信息 |
- 我们一般习惯将上述选项组合在一起使用,比如执行“ps aux” 或 “ps -elf”。
1.1 ps aus 命令
执行“ps aus” 命令后,将以简单列表的形式显示出进程信息,如下:
[root@localhost ~]#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 125488 3988 ? Ss 17:58 0:03 /usr/lib/syste
root 2 0.0 0.0 0 0 ? S 17:58 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 17:58 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 17:58 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 17:58 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 17:58 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 17:58 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 17:58 0:00 [watchdog/0]
root 11 0.0 0.0 0 0 ? S 17:58 0:00 [watchdog/1]
root 12 0.0 0.0 0 0 ? S 17:58 0:00 [migration/1]
root 13 0.0 0.0 0 0 ? S 17:58 0:00 [ksoftirqd/1]
root 14 0.0 0.0 0 0 ? S 17:58 0:00 [kworker/1:0]
root 15 0.0 0.0 0 0 ? S< 17:58 0:00 [kworker/1:0H]
root 16 0.0 0.0 0 0 ? S 17:58 0:00 [watchdog/2]
root 17 0.0 0.0 0 0 ? S 17:58 0:00 [migration/2]
root 18 0.0 0.0 0 0 ? S 17:58 0:00 [ksoftirqd/2]
root 19 0.0 0.0 0 0 ? S 17:58 0:00 [kworker/2:0]
root 20 0.0 0.0 0 0 ? S< 17:58 0:00 [kworker/2:0H]
在输出结果中,第一行为列表标题,其中各字段的含义描述如下:
字段 | 说明 |
---|---|
USER | 启动该进程的用户账号的名称 |
PID | 该进程在系统中的数字ID 号,在当前系统中是唯一的(%CPU:CPU 占用的百分比) |
TTY | 表明该进程在哪个终端上运行,“?”表示未知或不需要终端 |
STAT | 显示了进程当前的状态 |
START | 启动该进程的时间 |
TIME | 该进程占用的CPU时间 |
COMMAND | 启动该进程的命令的名称 |
%CPU | CPU 占用的百分比 |
%MEM | 内存占用的百分比 |
VSZ | 该进程使用的虚拟内存量(swap)(KB) |
RSS | 该进程占用的物理内存量(KB) |
1.2 ps -elf 命令
- 若执行“ps -elf”命令,则将以长格式显示系统中的进程信息,并且包含更丰富的内容。如下:
[root@localhost ~]#ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 31372 ep_pol 8月17 ? 00:00:03 /usr/lib/
1 S root 2 0 0 80 0 - 0 kthrea 8月17 ? 00:00:00 [kthreadd
1 S root 3 2 0 80 0 - 0 smpboo 8月17 ? 00:00:00 [ksoftirq
1 S root 5 2 0 60 -20 - 0 worker 8月17 ? 00:00:00 [kworker/
1 S root 7 2 0 -40 - - 0 smpboo 8月17 ? 00:00:00 [migratio
1 S root 8 2 0 80 0 - 0 rcu_gp 8月17 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 8月17 ? 00:00:01 [rcu_sche
5 S root 10 2 0 -40 - - 0 smpboo 8月17 ? 00:00:00 [watchdog
5 S root 11 2 0 -40 - - 0 smpboo 8月17 ? 00:00:00 [watchdog
1 S root 12 2 0 -40 - - 0 smpboo 8月17 ? 00:00:00 [migratio
1 S root 13 2 0 80 0 - 0 smpboo 8月17 ? 00:00:00 [ksoftirq
#省略
.
.
.
- 若执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程,如下:
[root@localhost ~]#ps
PID TTY TIME CMD
1652 pts/0 00:00:00 bash
6105 pts/0 00:00:00 ps
- 由于系统中运行的进程数比较多,需要查询某一个进程的信息时可以结合管道符号操作和 grep 命令进行过滤。例如执行以下操作可以过滤包含“bash”的进程信息。
[root@localhost ~]#ps aux |grep bash
root 804 0.0 0.0 115256 928 ? S 8月17 0:00 /bin/bash /usr/sbin/ksmtuned
root 1652 0.0 0.0 116576 3412 pts/0 Ss 8月17 0:00 -bash
root 6149 0.0 0.0 112680 976 pts/0 S+ 00:12 0:00 grep --color=auto bash
1.3 常见的进程状态
常见的状态有以下几种:
进程 | 说明 |
---|---|
-D | 不可被唤醒的睡眠状态,通常用于 I/O 情况 |
-R | 该进程正在运行 |
-S | 该进程处于睡眠状态,可被唤醒 |
-T | 停止状态,可能是在后台暂停或进程处于除错状态 |
-W | 内存交互状态(从 2.6 内核开始无效) |
-X | 死掉的进程(应该不会出现) |
-Z | 僵尸进程。进程已经中止,但是部分程序还在内存当中 |
-< | 高优先级(以下状态在 BSD 格式中出现) |
-N | 低优先级 |
-L | 被锁入内存 |
-s | 包含子进程 |
-l | 多线程(小写 L) |
-+ | 位于后台 |
-C | 进程占用CPU的百分比 |
其中僵尸进程大概意思可以理解为:父进程退出了而子进程没有退出。那么这些没退出去的子进程就没有父进程来管理了,所以就变成了僵尸进程。
2. 查看动态的进程统计信息(top)
2.1 top 命令输出信息详解
使用 ps 命令查看到的是一个静态的进程信息,并不能连续的反馈出当前进程的运行状态。如果希望以动态刷新的方式显示各进程的状态信息,可以使用 top 命令。
[root@localhost ~]#top
top - 00:36:46 up 6:38, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 160 total, 2 running, 158 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3865304 total, 3136808 free, 321668 used, 406828 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 3255172 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6348 root 20 0 0 0 0 R 0.3 0.0 0:00.12 kworker/0:2
1 root 20 0 125488 3988 2492 S 0.0 0.1 0:03.05 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:01.11 rcu_sched
上面输出的结果中,相关信息的表示如下:
①系统任务(Tasks)信息:
- total:总进程数
- running :正在运行的进程数
- sleeping :休眠的进程数
- stopped :终止的进程数
- zombie :僵死无响应的进程数
②CPU占用信息:
- us:用户占用
- sy:内核占用
- ni:优先级调度占用
- id:空闲CPU
- wa:I/O 等待占用
- hi:硬件中断占用
- si:软件中断占用
- st:虚拟化占用
- 要了解空闲的 CPU 百分比,主要看%id 部分。
③内存占用(Mem)信息:
- total:总内存空间
- free:空闲内存
- used:已用内存
- buff/cache:物理内存和交换内存的缓冲区总和。
④交换空间(Swap)占用:
- total:总交换空间;
- free:空闲交换空间;
- used:已用交换空间;
- avail Mem:可用物理空间。
2.2 常用选项
全屏操作界面快捷键如下
选项 | 说明 |
---|---|
s | 修改刷新时间按空格 ,立即刷新(top 命令默认 3s 刷新一次) |
P | 按 CPU 排序 |
M | 按内存排序 |
T | 按时间排序 |
p | 进程 IP,查看某个进程状态 |
N | 根据启动时间进行排序 |
1 | 显示每个内核的 CPU 使用率u/U:指定显示的用户 |
h | 可以获得 top 程序的在线帮助信息 |
q | 退出 top 程序 |
这里要注意的是如果通过 top 工具发现某个进程的CPU占用率非常高,需要终止该进程的时候,可以在top界面按 k 键,然后在列表上方将会出现“PID to signal/kill [default pid = 3180]:” 的提示信息,根据提示输入指定进程的 PID 号并按 Enter 键, 出现“Send pid 5597 signal [15/sigterm]”的二次确认的提示信息,然后按Enter 键确认即可终止对应的进程。
3.根据特定条件查询进程信息(pgrep)
- 当使用 ps命令 查询某个进程的PID信息时,往往需要结合grep命令对输出结果进行过滤,但这样使用非常不方便,而pgrep命令则正是用来查询特点进程信息的专用工具。
- 使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特点进程的PID号。
- 结合“-l”选项可同时输出对应的进程名
例如,查询进程名中包含“log”的进程及PID号
[root@localhost ~]#pgrep -l "log"
426 xfs-log/dm-0
652 xfs-log/sda1
721 systemd-logind
722 rsyslogd
746 abrt-watch-log
763 abrt-watch-log
- 还可以结合“-U”选项查询特定用户的进程、“-t”选项查询在特点终端运行的进程。例如,查询由用户admin 在tty1终端上运行的进程及PID号:
[root@localhost ~]#pgrep -l -U root -t tty1
1444 X
4.查看进程树(pstree)
pstree 命令可以输出各种进程的树形结构,更加直观地判断出各进程之间的相互关系(父子进程)。
- pstree命令默认只显示各进程的名称
- 结合“-p”选项可以同时列出对应的PID号
- 结合“-u”选项可以列出对应的用户名
- 结合“-a”选项可以列出完整的命令信息
- 执行“pstree -aup”命令可以查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息
[root@localhost ~]#pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,720
│ ├─{ModemManager},725
│ └─{ModemManager},738
├─NetworkManager,748 --no-daemon
│ ├─dhclient,834 -d -q -sf /usr/libexec/nm-dhcp-helper -pf ...
│ ├─{NetworkManager},775
│ └─{NetworkManager},778
- 也可以只查看属于指定用户的进程树结构,只要指定用户名作为参数即可。
[root@localhost ~]#pstree -ap root
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,720
│ ├─{ModemManager},725
│ └─{ModemManager},738
三、控制进程
1.进程的启动方式
在Linux系统中,可以由用户手工启动或者预定计划调度启动新的进程。
1.1 手工启动进程
由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工进程又可以分为前台启动和后台启动。
- 前台启动:用户输入命令,直接执行程序
- 后台启动:在命令行尾加入“&”符号
例如,从光盘中制作镜像文件时,由于复制量比较多,耗时较长,可以使用“&”来将进程放入后台运行,以便可以继续执行其他操作。
[root@localhost ~]#cp /dev/cdrom mycd.iso &
[1] 5959 #输出结果中包括后台任务序号及PID号
1.2 调度启动进程
在服务器维护工作中,经常需要执行数据备份的任务,一般来说比较费时且占用资源,这时候我们可以计划在夜间进行。这时候就需要用户事先进行调度安排,指定任务运行的时间,当到达设定的时间会自动启动并完成指定的任务。调度启动的计划任务进程都在后台运行,不会占用用户的命令终端
- 可以使用 at 和crontab 命令设置
- at 命令用于设置一次性计划任务
- crontab 命令用于设置周期性运行的计划任务
2.改变进程的运行方式
-
挂起当前的进程
当Linux系统的命令正在前台执行时,按 ctrl +z 组合键可以将当前的进程挂起,即调入后台并停止执行。 -
查看后台的进程
需要查看当前终端中在后台运行的进程任务时,可以使用 jobs 命令,结合 “-l ” 选项可以同时显示出该进程对应的PID号。 -
将后台的进程恢复运行
bg 命令:可以将后台中暂停执行(如按ctrl+z 组合键挂起)的任务恢复运行,继续在后台执行操作
fg 命令:可以将后台的任务重新恢复到前台运行
除非后台的任务只有一个,否则 bg 和 fg 都需要指定后台进程的任务编号作为参数
[root@localhost ~]#jobs -l
[1]+ 5959 完成 cp -i /dev/cdrom mycd.iso
#[1]代表该进程在后台的任务编号
3.终止进程执行
当用户在前台执行某个进程时,可以按 ctrl +c 组合键强制执行终端(如命令长时间没有响应的情况)。如果使用ctrl+c组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具 kill 、killall、pkill 。
- 使用 kill 命令终止进程,需要使用进程的PID号作为参数,结合“-9”选项可以强制终止进程,但是强制终止进程可能会导致部分数据丢失,所以不到不得已的情况时不要轻易使用
- 使用 killall 命令终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令更加方便,效率更高。
- 使用 pkill 命令终止进程,可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特点的进程,大部分选项和 pgrep 命令基本相似,如-U 指定用户、-t指定终端等。
例如,终止lisi用户启动的进程,如下:
[root@localhost ~]#pgrep -l -U "lisi" #确认目标进程相关信息
3045 bash
[root@localhost ~]#pkill -9 -U "lisi" #强制终止用户lisi的进程
[root@localhost ~]#pgrep -l -U "lisi" #查看是否终止
四、计划任务管理
CentOS 7系统中的计划任务是由 at 、cronie 软件包提供,通过 atd 和crond 这两个系统服务实现一次性和周期性计划任务的功能,并分别通过at 、crontab 命令进行计划任务设置。
1.一次性任务设置(at)
- 使用at命令设置的计划任务只在指定的时间点执行一次。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后,否则将无法正确设置计划任务。
- 设置一次性计划任务时,在 at 命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带 “at>” 提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D 组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。
案例
①设置在 2021 年8 月 19日的10:25 自动执行以下任务:统计该时间点系统中由 root 用户运行的进程的数量,并将该数值保存到/tmp/ps.root 文件中。
[root@localhost ~]#date
2021年 08月 18日 星期三 16:54:42 CST
[root@localhost ~]# at 10:25 2021-08-19
at> pgrep -U root | wc -l > /tmp/ps.root #任务设置完后按Ctrl+D 组合键提交
at> <EOT><EOT>
job 1 at 2021-08-19 10:25
[root@localhost ~]# cat /tmp/ps.root #过了计划时间后验证结果
②设置一条计划任务,在当天的 21:30 自动关闭当前系统。
[root@localhost ~]# at 21:30
at> shutdown -h now
at> <EOT>
③对于已经设置但还未执行(未到时间点)的计划任务,可以通过 atq 命令进行查询。但已执行过的 at 任务将不会再出现在列表中
[root@localhost ~]# atq
2 Sun May 7 21:30:00 2021 a root
④如果想要删除指定编号的 at 任务,可以使用 atrm 命令。删除后的 at 任务将不会被执行, 并且不会显示在 atq 命令的显示结果中,但已经执行过的任务无法删除。
[root@localhost ~]# atrm 1 #删除第 1 条 at 计划任务
[root@localhost ~]# atq #确认第 1 条任务已被删除
2.周期性任务设置(crontab)
使用 crontab 命令设置的计划任务可以按预设的周期重复执行,可以大大减轻设置重复性系统管理任务的操作。
2.1 主要设置文件
- 全局配置文件——位于文件/etc/crontab
- 系统默认的设置——位于/etc/cron.*/
- 用户定义的设置——位于/var/spool/cron/
2.2 管理crontab任务计划
- crontab -e [-u 用户名]——编辑计划任务
- crontab -l [-u 用户名]——查看计划任务
- crontab -r [-u 用户名]——删除计划任务
- -u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
crontab 计划任务的配置字段说明如下:
字段 | 说明 |
---|---|
分钟 | 取值为从0到59之间的任意整数 |
小时 | 取值为从0到23之间的任意整数 |
日期 | 取值为从1到31之间的任意整数 |
月份 | 取值为从1到12之间的任意整数 |
星期 | 取值为从0到7之间的任意整数,0或7代表星期日 |
命令 | 要执行的命令或程序脚本 |
- 除了”*“之外,还可以使用减号”-“、逗号”,“、斜杠”/“与数字构成表达式来表示较复杂的时间关系。
字符 | 说明 |
---|---|
“*” | 表示该范围内的任意时间 |
“,” | 表示一个间隔内的多个不连续时间点 |
“-” | 表示一个连续的时间范围 |
“/” | 表示间隔的时间频率 |
案例
例如,按固定的周期重复完成一些系统管理任务,任务内容如下:
- ①每天早上 8:55自动开启 sshd 服务,22:00 关闭 sshd 服务
- ②每隔3天清空一次 FTP 服务器公共目录 /var/ftp/pub 中的数据
- ③每周五的 9:00 重新启动系统中的 httpd 服务
- ④每周一、周三、周五的下午 18:30,使用 tar 命令自动备份/etc/httpd 目录,则可由 root 用户通过 crontab 设置以下计划任务
[root@localhost ~]# crontab -e
55 8 * * * /usr/bin/systemctl start httpd.service
00 22 * * * /usr/bin/systemctl stop httpd.service
0 0 */3 * * /usr/bin/rm -rf /var/ftp/pub/*
00 9 * * 5 /usr/bin/systemctl httpd restart
30 18 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/
删除用户的计划任务列表
- 当只需要删除某一条计划任务时,可以通过“crontab -e”命令进行编辑。
- 如果要清空某个用户的所有计划任务,可以执行“crontab -r”命令。
[lisi@localhost ~]$ crontab -r
[lisi@localhost ~]$ crontab -l
no crontab for lisi #用户lisi清空自己设置的计划任务
总结
Linux 系统的多任务环境决定了进程管理的重要性,及时查看并清除占用较高的进程有利于提高工作的效率。