进程与计划任务管理
一.程序和进程的关系
程序
- 保存在硬盘,光盘等介质中的可执行代码和数据
- 文件中静态保存的代码
进程:
- 在cpu及内存中运行的程序代码
- 动态执行的代码
- 父,子进程
- 每个程序可以创建一个或多个进程
例:提供Web服务的httpd程序,当有大量用户同时访问Web时,httpd程序可能会创建多个进程来提供服务。
二.查看进程
1.查看进程信息ps
ps命令:查看静态的进程统计信息 |
(1)【root@localhost ~】#ps -elf
e: //显示系统内的所有进程信息。
l: //使用长格式显示进程信息
f: //使用完整的格式显示进程信息
a: //显示现行终端下的所有进程
T: //查看线程信息
ps -aT //显示所有线程
ps -T -p <pid> //查看指定进程中已经起的线程
ps -L <pid> //查看指定进程中的线程信息
ps aux --sort -%cpu | head -10 //按CPU降序排列,-为降序,+为升序,p与%同义
ps aux --sort +pmem | head -n 10 //按内存升序排列
ps aux --sort -pcpu,+pmem | head -n 10
F | 内核分配给进程的系统标记 |
S | 进程的状态 |
UID | 启动这些进程的用户 |
PID | 进程的进程ID |
PPID | 父进程的进程号 (如果该进程是由另一个进程启动的) |
C | 进程生命周期中的CPU利用率 |
PRI | 进程的优先级(越大的数字代表越低的优先级) |
NI | 谦让度值用来参与决定优先级 |
ADDR | 进程的内存地址 |
SZ | 假如进程被换出,所需交换空间的大致大小 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
STIME | 进程启动时的系统时间 |
TTY | 进程启动时的终端设备 |
TIME | 运行进程需要的累计CPU时间 |
CMD | 进程的启动命令 |
(2)【root@localhost ~】#ps -aux
或 【root@localhost ~】#ps aux
a: //显示终端bai上的所有进程,包括其它用户的进程。
u: //表示列出进程的用户
x: //显示所有终端的进程。
USER | 进程的用户 |
PID | 进程的ID |
%CPU | 进程占用的CPU百分比 |
%MEM | 占用内存的百分比 |
VSZ | 该进程使用的虚拟内存量 (KB) |
RSS | 该进程占用的物理内存量 (KB) |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为? |
STAT | 该行程的状态(D:不可中断的休眠状态,R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态;Z:僵尸进程,进程已经中止,但是部分程序还在内存当中) |
START | 该进程被触发启动时间 |
TIME | 该进程实际使用CPU运行的时间 |
COMMAND | 进程的启动命令 |
僵尸进程:
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程;如果是的化,就由Init来接管它,成为它的父进程,子进程退出Init会回收其占用的相关资源;
但是当子进程比父进程先结束,而父进程又没有回收子进程,释放了子进程占用的资源。此时子进程将成为一个僵尸进程。
2.查看进程信息top
top命令: 查看动态的进程排名信息 |
命令查看进程动态信息
<1> top - 16:16:46 up 7:46, 2 users, load average: 0.00, 0.01, 0.05
<2> Tasks: 225 total, 1 running, 224 sleeping, 0 stopped, 0 zombie
<3> %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
<4> KiB Mem : 8154928 total, 6527592 free, 1010952 used, 616384 buff/cache
<5> KiB Swap: 9211900 total, 9211900 free, 0 used. 6859600 avail Mem
<1>第一行是任务队列信息
16:16:46 | 系统时间 |
up 7:46 | 系统已运行时长 |
2 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值 |
<2>第二行为进程信息
Taske | 总进程数 |
running | 正在运行的进程数 |
sleeping | 休眠的进程数 |
stopped | 中止的进程数 |
zombie | 僵死的进程数 |
<3>第三行为CPU的信息
us | user time,表示 CPU 执行用户进程的时间,包括 nice 时间。通常都是希望用户空间CPU越高越好。 |
sy | system time,表示 CPU 在内核运行的时间,包括IRO和softirg。系统 CPU占用越高,表明系统某部分存在瓶颈。通常这个值越低越好。 |
ni | nice time,具有优先级的用户进程执行时占用的 CPU 利用率百分比 |
id | idle time,表示系统处于空闲期,等待进程运行。 |
wa | : waiting time,表示 CPU 在等待IO操作完成所花费的时间。系统不应该花费大量的时间来等待IO 操作,否则就说明 IO存在瓶颈。 |
hi | hard IRO time,表示系统处理硬中新所花费的时间。 |
si | soft IRO time,表示系统处理软中断所花费的时间 |
st | stealtime,被强制等待 |
<4>第四行为内存的信息
total | 总内存空间 |
free | 空闲内存 |
used | 已用内存 |
buff/cache | 物理内存和交换的缓存区总和 |
<5>第五行为交换空间的信息
total | 总交换空间 |
free | 空闲交换空间 |
used | 已用交换空间 |
avail Mem | 可用物理空间 |
进程信息区各列解释: |
PID: //进程ID
USER: //进程所有者的用户名
PR: //优先级
NI: //谦让度值。负值表示高优先级,正值表示低优先级
VIRT: //进程使用的虚拟内存总量,单位KB
RES: //进程使用的物理内存大小,单位kb
SHR: //共享内存大小,单位kb
S: //进程状态
%CPU //上次更新到现在的CPU时间占用百分比
%MEM //进程使用的物理内存百分比
TIME: //进程使用的CPU时间总计,单位1/100秒
COMMAND: //命令行/命令行
谦让度和优先级:
优先级高的进程更早被处理。谦让度和优先级是一对相反的概念,高谦让度意味着低优先级,允许用户设置谦让度
top常用命令: |
P 键: //根据cPu使用百分比大小进行排宁
M键: //根据驻留内存大小进行排序
N 键: //根据启动时间进行排序
C键: //切换显示命令名称和完整命令行
h 键: //可以获得 top程序的在线帮助信息
l 键: //显示CPU个数
k 键: //根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程
q 键: //退出 top 程序
数字1键: //显示cpu个数和状态
top -H: //显示所有线程
top -H -P<pid>: //显示特定进程中的线程
3.查看进程信息pgrep
pgrep命令:根据特定条件查询进程PID信息 |
根据特定条件查询进程PID信息
- -l:显示进程名,缺省时只输出PID号
- -U:指定特定用户
- -t:指定终端
【root#localhost~】# pgrep -l “log” -l:显示进程名 缺省时只输出PID号
【root#localhost~】#pgrep -l -U teacher -t tty2 -U:指定特定用户 -t:指定终端
4.查看进程数pstree
pstree命令:以树形结构列出进程信息 |
pstree命令是用于查看进程树之间的关系,即哪个进程是父进程,哪个是子进程,可以清楚的看出来是谁创建了谁。
几个重要的参数:
- -A: 各进程树之间的连接以ASCII码字符来连接
- -U:各进程树之间的连接以utf8字符来连接,某些终端可能会有错误
- -p:同时列出每个进程的PID
- -u: 同时列出每个进程的所属账号名称
【root#localhost~】#pstree -aup (用户名) //-a:显示完整信息 -u:列出对应用户名 -p:列出对应PID号
【root#localhost~】#pstree -ap teacher //只查看属于指定用户的进程树结构
三.控制进程
1.进程的启动方式
手动启动:
- 前台启动:用户输入命令,之间执行程序
- 后台启动:在命令行尾加入“&”符号
【root#localhost~】#cp /dev/cdrom mycd.iso & //输出信息中包括后台任务序号,PID号
调度启动:
-
使用at命令,设置一次性计划任务
-
使用crontab命令,设置周期性计划任务
2.进程的前后台调度
Ctrl+Z组合键:
- 将当前进程挂起,即调入后台并停止执行
jobs命令:
- jobs【-l】
- 查看处于后台的任务列表
fg命令:
- 将后台进程恢复到前台运行。可指定任务序号`
【root#localhost~】#jobs
【root#localhost~】#fg 1
3.指定进程得运行
Ctrl+C组合键:
- 中断正在执行的命令
kill,killall命令:
kill用于终止指定PID号的进程
killall用于终止指定名称相关的所有进程
-9选项用于强制终止(强制终止进程可能会导致程序运行的部分数据丢失,因此不得以时不要轻易使用“-9”选项)
- 我们经常会用到
kill
命令去杀死一个进程,但是有时候会出现kill不成功的现象,这时就要用到kill -9
- 之所以这两个命令会有区别是因为所发送的信号(Signal)是不同的:
默认情况下kill
命令的参数为-15
,如下图所示:
kill -15
代表的信号为SIGTERM
,这是告诉你进程需要被关闭,请自行停止运行并退出;而kill -9
代表的信号是SIGKILL
,表示进程被终止,需要立即退出; - 因此
kill -9
表示强制杀死该进程,这个信号不能被捕获也不能被忽略
pkill命令:
根据特定条件终止相应的进程
常用命令选项:
-u:<用户名>根据进程所属的用户名终止相应进程
-t:<中端>根据进程所在的终端终止相应进程
【root#localhost~】#pgrep -l -u ‘teacher’
【root#localhost~】#pkill -9 -U ‘teacher’
【root#localhost~】#pgrep -l -U ’teacher‘
四.计划任务管理
1.at命令:一次性计划任务
at 【HH:MM】 [yyy-mmm-dd] -------->ctrl+d ------->atq
- 使用at命令设置的任务只在指定时间点执行一次,若只指定时间
- 则表示当天的该时间,若只指定日期则表示该日期的当前时间
可以在at交互环境中输入多条命令,最后按Ctrl + D组合键提交
案例:
(1):今天的20:23时自动关闭当前系统
[root@localhost ~]# at 20:23 //不携带日期表示当日
at> shutdown -h now //自动关闭系统
at> <EOT> //按Ctrl+D键提交任务
job 4 at Tue Apr 11 20:23:00 2023
[root@localhost ~]# atq //查看未执行的任务列表
4 Tue Apr 11 20:23:00 2023 a root
[root@localhost ~]# atrm 4 //删除第4条任务
2.crontab命令
- 按照预先设置的时间周期 (分钟、小时、天、月、周)重复执行用户指定的命令操作
- 属于周期性计划任务
- 主要设置文件
- 全局配置文件,位于文件: /etc/crontab
- 系统默认的设置,位于目录: /etc/cron.*/
- 用户定义的设置,位于文件: /ar/spool/cron/用户名
编辑计划任务:
crontab -e [-u 用户名] //-u缺省时默认是针对当前用户
查看计划任务
crontab I [-u 用户名]
删除计划任务
crontab -r [-u 用户名1
五.crontab周期性任务设置
1.crontab任务配置的格式
- 前面5个字段用于指定任务重复执行的时间规律,第6个字段用于指定具体的任务内容
- crontab任务配置记录中,所设置的命令在“分钟+小时+日期+月份+星期”都满足的条件下才会运行
|
| ||
---|---|---|---|
分钟 | 取值为从0到59之间的任意整数 | ||
小时 | 取值为从0到23之间的意整数 | ||
日期 | 取值为从1到31之间的任意整数 | ||
月份 | 取值为从1到12之间的任意整数 | ||
星期 | 取值为从0到7之间的任意整数,0或7代表星期日 | ||
命令 | 要执行的命令或程序脚本 |
2.时间数值的特殊表示方法
- *表示该范围内的任意时间
- ,表示间隔的多个不连续时间点
- – 表示一个连续的时间范围
- / 指定间隔的时间频率
应用示例:
0 17 * * 1-5 //周一到周五每天17:00
30 8 * * 1,3,5 //每周一、三、五的8点30分
0 8 -18/2 * * * //8点到18点之间每2小时
0 * * /3 * * //每3天
示例
crontab -e [-u root]
- 1.每分钟定时执行一次规则:
每1分钟执行:*/1 * * * *者* * * * *
每5分钟执行:*/5 * * * *
- 2.每小时定时执行一次规则:
每小时执行:0 * * * *或者0 */l * * *
每天上午7点执行:0 7 * * *
每天上午7点10分执行:10 7 * * *
- 3.每天定时执行一次规则:
每天执行0 0 * * *
- 4.每周定时执行一次规则:
每周执行0 0 * * 1
- 5.每月定时执行一次规则:
每月执行0 0 1 * *
- 6.每年定时执行一次规则:
每年执行 0 0 1 1 *
- 7.其他例子:
5 * * * * ls 指定每小时的第5分钟执行一次ls命今
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7: 30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5: 30执行ls命令
30 3 10, 20 * * 1s 每月10号及20号的3: 30执行1s命令【注:","用来连接多个不连续的时段】
25 8-11 * * * ls 每天8-11点的第25分钟执行1s命令【注:“_"用来连接连续的时段】
*/15 * * * * 1s 每15分钟执行一次1s命今【即每个小时的第0 15 30 45 60分钟执行1s命令】