文章目录
前言
Linux系统中的进程就相当于Windows的任务管理器,只是区别于任务管理器的是进程需要用命令来管理的。
一、程序和进程的关系
1、程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 静态保存的代码
2、进程
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 父、子进程
- 每个程序可以创建一个或多个进程
二、查看进程
1、查看进程信息ps
常用选项:
选项 | 说明 |
---|---|
-a | 显示当前用户所在终端下的进程信息 |
-u | 使用以用户为主的格式输出进程信息 |
-x | 显示当前用户在所有终端下的进程信息 |
-e | 显示系统内的所有进程信息 |
-l | 使用长格式显示进程信息 |
-f | 使用完整的格式显示进程信息 |
1.1.ps aus 命令
执行“ps aus” 命令后,将以简单列表的形式显示出进程信息,如下:
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下。
USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
%CPU:CPU 占用的百分比。
%MEM:内存占用的百分比。
VSZ:该进程使用的虚拟内存量(KB)。
RSS:该进程占用的物理内存量(KB)。
TTY:表明该进程在哪个终端上运行。不是从终端启动的进程则显示为?。
STAT:该进程的状态(D:不可中断的休眠状态:R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态: Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)
START:启动该进程的时间。
TIME:该进程占用的 CPU时间。
COMMAND:启动该进程的命令的名称。
1.2. ps -elf 命令
执行“ps -elf”命令,则将以长格式显示系统中的进程信息,并且包含更丰富的内容。如下:
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下:
F:内核分配给进程的系统标记。
S:进程的状态。
UID:启动这些进程的用户。
PID: 进程的进程ID.
PPID:父进程的进程号(如果该进程是由另一“个进程启动的)
C:进程生命周期中的CPU利用率。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI: 谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
**SZ:**假如进程被换出,所需交换空间的大致大小。
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备。
TIME:运行进程需要的累计CPU时间。
CMD:进程的启动命令。
1.3.常见的进程状态
进程 | 说明 |
---|---|
-D | 不可被唤醒的睡眠状态,通常用于 I/O 情况 |
-R | 该进程正在运行 |
-S | 该进程处于睡眠状态,可被唤醒 |
-T | 停止状态,可能是在后台暂停或进程处于除错状态 |
-W | 内存交互状态(从 2.6 内核开始无效) |
-X | 死掉的进程(应该不会出现) |
-Z | 僵尸进程。进程已经中止,但是部分程序还在内存当中 |
-< | 高优先级(以下状态在 BSD 格式中出现) |
-N | 低优先级 |
-L | 被锁入内存 |
-s | 包含子进程 |
-l | 多线程 |
-+ | 位于后台 |
-C | 进程占用CPU的百分比 |
1.4.僵尸进程
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变
成僵尸进程,因为每个进程结束的时候,系统都会扫描当
前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵厂进程。
总结来说:父进程退出子进程没有退出那么这些子进程就没有父进程来管理了,就变成僵尸进程。
2.查看进程信息top
上述输出信息中,开头的部分显示了系统任务(Tasks)、CPU占用、内存占用(Mem)、交换空间(Swap)等汇总信息,汇总信息下方依次显示当前进程的排名情况。相关信息的含义表述如下。
17:47:26 当前时间
up 1:24 系统运行时间 ,说明此服务器运行一小时24分钟了
2 users 当前登录用户数
load average: 0.00, 0.01, 0.08 系统负载,即任务队列的平均长度。 三个数值分别为 1 分钟、5 分钟、15 分钟前到现在的平均值。
系统任务(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,可用物理空间。
top 命令全屏操作界面快捷键:
默认 3s 刷新一次,按 s 修改刷新时间,按空格 :立即刷新。
P:按 CPU 排序
M:按内存排序
T:按时间排序
p: 进程 IP,查看某个进程状态
N 键根据启动时间进行排序
数字键 1:显示每个内核的 CPU 使用率u/U:指定显示的用户
h:可以获得 top 程序的在线帮助信息
q:键可以正常地退出 top 程序
3.查看进程信息pgrepp
根据特定条件查询进程PID信息
常用的参数
-l:选项可同时输出对应的进程名以及PID
-U:选项查询特定用户的进程
-t:选项查询在特定终端运行的进程
[root@localhost ~]#pgrep -l "sys" //查询进程名中包含“sys”的进程及PID号
1 systemd
4298 systemd-journal
4335 systemd-udevd
8724 systemd-logind
9373 rsyslogd
[root@localhost ~]#pgrep -l -U root -t tty1 //查询由用户在tty1终端上运行的进程及PID号:
9593 X
4.查看进程树pstree
结合以下常用的参数使用:
-p:选项使用时可以同时列出对应的PID号
-u:选项可以列出对应的用户名
-a:选项可以列出完整的命令信息
三、控制进程
1.进程的启动方式
1.1 手工启动进程
由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否 需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。
- 前台启动:用户输入命令,直接执行程序
- 后台启动:在命令行尾加入“&”符号
例如,从光盘中制作镜像文件时,由于复制量比较多,耗时较长,可以使用“&”来将进程放入后台运行,以便可以继续执行其他操作。
[root@localhost ~]#cp /dev/cdrom mycd.iso &
[1] 5959 //输出结果中包括后台任务序号及PID号
1.2 调度启动进程
在服务器维护工作中,经常需要执行数据备份的任务,一般来说比较费时且占用资源,这时候我们可以计划在夜间进行。这时候就需要用户事先进行调度安排,指定任务运行的时间,当到达设定的时间会自动启动并完成指定的任务。调度启动的计划任务进程都在后台运行,不会占用用户的命令终端。
- 可以使用 at 和crontab 命令设置
- at 命令用于设置一次性计划任务
- crontab 命令用于设置周期性运行的计划任务
2.改变进程的运行方式
CTRL + Z 组合键:将当前进程挂起,即调入后台并停止执行
Jobs命令:查看后台的任务列表(只能在当前使用的终端可以查询)
fg命令:将后台进程恢复到前台运行,可指定任务序号
[root@localhost ~]#vim cui.txt //进入编辑,Ctrl+z进入后台运行
[1]+ 已停止 vim cui.txt
[root@localhost ~]#jobs -l //查看后台任务
[1]+ 22628 停止 vim cui.txt
[root@localhost ~]#fg 1 //将编辑cui.txt进程恢复至前台运行
vim cui.txt
3.终止进程执行kill
当用户在前台执行某个进程时,可以按 ctrl +c 组合键强制执行终端(如命令长时间没有响应的情况)。如果使用ctrl+c组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具 kill 、killall、pkill 。
- 使用 kill 命令终止进程,需要使用进程的PID号作为参数,结合“-9”选项可以强制终止进程,但是强制终止进程可能会导致部分数据丢失,所以不到不得已的情况时不要轻易使用。
- 使用 killall 命令终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令更加方便,效率更高。
- 使用 pkill 命令终止进程,可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特点的进程,大部分选项和 pgrep 命令基本相似,如-U 指定用户、-t指定终端等。
[root@localhost ~]#vim cui.txt
[1]+ 已停止 vim cui.txt
[root@localhost ~]#jobs -l
[1]+ 22804 停止 vim cui.txt
[root@localhost ~]#kill -9 22804 //强制终止进程
[root@localhost ~]#jobs -l
[1]+ 22804 已杀死 vim cui.txt
[root@localhost ~]#vim cui.txt
[1]+ 已停止 vim cui.txt
[root@localhost ~]#vim cui1.txt
[2]+ 已停止 vim cui1.txt
[root@localhost ~]#jobs -l
[1]- 22829 停止 vim cui.txt
[2]+ 22830 停止 vim cui1.txt
[root@localhost ~]#killall -9 vim //强制终止所有vim进程
[1]- 已杀死 vim cui.txt
[2]+ 已杀死 vim cui1.txt
[root@localhost ~]#pgrep -l -U cuipw
22939 bash
22981 vim
[root@localhost ~]#pkill -9 -U cuipw //终止用户cuipw
已杀死
四、计划任务管理
1.一次性计划任务at
使用at命令设置的计划任务只在指定的时间点执行一次,前提是对应的系统服务atd必须已经运行。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后, 否则将无法正确设置计划任务。
设置一次性计划任务时,在 at 命令行中依次指定计划执行任务的时间、日期作为参数.
[root@localhost ~]#at 18:50
at> shutdown -h now
at> <EOT> //任务设置完毕后按Ctrl+D提交
job 2 at Mon Aug 23 18:50:00 2021
[root@localhost ~]#atq
2 Mon Aug 23 18:50:00 2021 a root
对于已经设置但还未执行(未到时间点)的计划任务,可以通过 atq 命令进行查询。
若要删除指定编号的 at 任务,可以使用 atrm 命令。删除后的 at 任务将不会被执行, 并且不会显示在 atq 命令的显示结果中,但已经执行过的任务无法删除。
2.周期性任务设置crontab
2.1 主要设置文件
- 全局配置文件——位于文件/etc/crontab
- 系统默认的设置——位于/etc/cron.*/
- 用户定义的设置——位于/var/spool/cron/
2.2 管理crontab任务计划
crondtab 通过多个目录和文件设置计划任务,不同类型的任务由不同的配置文件来设置。
常用的选项如下:
-e:编辑计划任务列表。
-u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
-l:列表显示计划任务。
-r:删除计划任务列表。
除此之外:
“*”表示该范围内的任意时间。
“,”表示一个间隔内的多个不连续时间点。
“-”表示一个连续的时间范围。
“/”表示间隔的时间频率。
[root@localhost ~]# crontab -e
30 8 * * * /usr/bin/systemctl start httpd.service
//分 时 日 月 周
分钟 取值为从0到59之间的任意整数
小时 取值为从0到23之间的任意整数
日期 取值为从1到31之间的任意整数
月份 取值为从1到12之间的任意整数
星期 取值为从0到7之间的任意整数,0或7代表星期日
命令 要执行的命令或程序脚本\
总结
Linux 系统的多任务环境决定了进程管理的重要性,及时查看并清除占用较高的进程有利于提高工作的效率。