程序和进程的关系
◾ 程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 文件中静态保存的代码
◾ 进程
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 父、子进程
- 每个程序可以创建一个或多个进程
1.进程、程序、线程
- 程序:是保存在硬盘、光盘等介质中的可执行代码和数据,可以包含一个或者多个进程
- 进程:在CPU及内存中运行的程序代码,动态执行的代码,而且进程可以包含一个或者多个线程,还可以包含一个或者多个子进程
- 线程:执行操作的最小单元
2.进程的五种状态
- 运行状态(正在运行或在运行队列中等待)
- 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
查看进程信息ps(静态)
查看静态的进程统计信息
方法一:
[root@localhost ~]# ps aux
a:显示终端上的所有进程,包括其它用户的进程。
u:表示列出进程的用户。
x:显示所有终端的进程。
USER∶ 进程的用户。
PID∶进程的ID。
%CPU∶进程占用的CPU百分比。
%MEM∶ 占用内存的百分比。
VSZ∶该进程使用的虚拟内存量(KB)。
RSS∶ 该进程占用的物理内存量(KB)。
TTY∶ 启动进程的终端名。不是从终端启动的进程则显示为 ?
STAT∶该行程的状态
第一列:(第一状态是大写的)
D:不可中断
S:可中断
r:正常运行
z:僵死状态
T:停止运行
第二列:
<:高优先级(可获得cpu的分片更长)
+:当前进程运行在前台
N:低优先级
s:是控制进程
l:是多线程的
START∶该进程被触发启动时间。
TTME∶该进程实际使用CPU运行的时间。
COMMAND∶进程的启动命令。
方法二:
[root@localhost ~]# ps -<elf
●-e:显示系统内的所有进程信息。
●-l:使用长格式显示进程信息。
●-f:使用完整的格式显示进程信息。
F∶ 内核分配给进程的系统标记。
S∶ 进程的状态。
UID∶ 启动这些进程的用户。
PID∶ 进程的进程ID。
PPID∶ 父进程的进程号(如果该进程是由另一个进程启动的)。
C∶ 进程生命周期中的CPU利用率。
PRI∶ 进程的优先级(越大的数字代表越低的优先级)。
NI∶ 谦让度值用来参与决定优先级。
ADDR∶ 进程的内存地址。
Sz∶ 假如进程被换出,所需交换空间的大致大小。
WCHAN∶若该进程在睡眠,则显示睡眠中的系统函数名。
STIME∶ 进程启动时的系统时间。
TTY∶ 进程启动时的终端设备。
TIME∶ 运行进程需要的累计CPU时间。
CMD∶ 进程的启动命令。
查看进程信息top(动态)
每行对应的信息
top - 12:56:51 up 2:50, 2 users, load average: 0.00, 0.01, 0.05
#第一行是任务队列信息
12:56:51: 系统时间
up 2:50: 系统已运行时长
2 user: 当前登录用户数
load average: 0.00, 0.01, 0.05 :系统负载,即单位时间内系统处理的任务数,
后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
Tasks: 223 total, 1 running, 222 sleeping, 0 stopped, 0 zombie
第二行为进程信息
Tasks :总进程数
running :正在运行的进程数
sleeping :休眠的进程数
stopped :中止的进程数
zombie :僵死的进程数
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第三行为CPU的信息
us :用户占用
sy :内核占用
ni :优先级调度占用
id :空闲CPU,要了解空闲的 CPU 百分比,主要看%id 部分
wa:I/O 等待占用
hi :硬件中断占用
si :软件中断占用
st :虚拟化占用
KiB Mem : 3861520 total, 1190856 free, 773196 used, 1897468 buff/cache
第四行为内存的信息
total:总内存空间
free :空闲内存
used:已用内存
buff/cache:物理内存和交换内存的缓冲区总和
KiB Swap: 4064252 total, 4064252 free, 0 used. 2730428 avail Mem
第五行为交换空间的信息
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程序的在线帮助信息 |
k 键 | 根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程 |
q 键 | 退出 top 程序 |
数字1 键 | 显示CPU个数和状态 |
pgrep命令——查看进程信息
pgrep:根据特定条件查询进程PID信息
例:pgrep -l “log”
pgrep -l -U teacher -t tty2
-l:显示进程名 缺省时只输出PID号
-U:指定特定用户
-t:指定终端
pstree命令——查看进程树
以树形结构列出进程信息
pstree -aup
-a:显示完整信息
-u:列出对应用户名
-p:列出对应PID号
例:pstree -ap teacher:只查看属于制定用户的进程树结构
进程的启动模式
1. 手工启动进程
前台启动∶ 用户输入命令,直接执行程序
后台启动∶在命令行尾加入"&"符号
[root@localhost~]#cp /dev/cdrom mycd.iso &
[1] 28454 (输出信息中包括后台任务序号、PID号)
2.调度启动
使用at命令,设置一次性计划任务
使用crontab命令,设置周期性计划任务
3.进程的前后台调度
①Ctrl+z组合键
将当前程序挂起,即调入后台并停止执行
②jobs命令
jobs 【-l】
查看处于后台的任务列表
③fg命令
将后台进程恢复到前台运行,可指定任务序号
4.终止进程的运行
当用户在前台执行某个进程时,可以按Ctrl+C组合键强制进行中断(如命令长时间没有响应的情况下)。中断前台进程的运行后,系统将返回到命令行提示符状态等待用户输入新的命令。当按Ctrl+C组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具kill、killall和pkill。
(1)使用kill命令终止进程
通过kill命令终止进程时,需要使用进程的PID号作为参数。无特定选项时,kill命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9”选项强行终止进程。强制终止进程时可能会导致程序运行的部分数据丢失,因此不到不得已时不要轻易使用“-9”选项。例如,若SSH服务的sshd进程的PID号为2869,则执行“kill 2869”命令后可以将进程 sshd终止。
[root@localhost~]#pgrep-1"sshd" //查询目标进程的PID号
2869 sshd
[root@localhost~]#kill 2869 //终止指定PID的进程
[root@localhost ~]# pgrep -l "sshd" //确认进程已终止(查询时无结果)
对于无法正常终止的系统进程,在必要时可以结合“-9”选项强制终止。例如,以下操作展示了强制终止vim进程的过程。
[root@localhost~]# vim tmpfile //打开vim程序并挂起作为测试
[1]+Stopped vim tmpfile
[root@localhost~]#jobs-1 //查询目标进程的PID号
[1]+2993 停止 vim tmpfile
[root@localhost~]#kill 2993 //尝试正常结束进程
[root@localhost~]#jobs-1 //但发现vim进程并未退出
[1]+2993 停止 vim tmpfile
[root@localhost~]# kill-9 2993 //强制终止目标进程
[root@localhost~]#jobs-l //成功终止vim进程
[1]+2993 已杀死
vim tmpfile
(2)使用killall命令终止进程
使用killall命令可以通过进程名来终止进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便,效率更高。killall命令同样也有“-9”选项。例如,执行“killall-9 vim”命令可将所有名为vim的进程都强行终止。
[root@localhost~]# vim testfile1 //挂起第1个vim测试进程
[1]+ Stopped
vim testfilel
[root@localhost~]# vim testfile2 //挂起第2个vim测试进程
[2]+Stopped
vim testfile2
[root@localhost~]#jobs-1 //确认待终止的进程信息
[1]-3029停止
vim testfilel
[2]+3030停止
vim testfile2
[root@localhost~]#killall-9 vim //通过进程名终止多个进程
[1]-已杀死
vim testfilel
[2]+已杀死 vim testfile2
(3)使用pkill命令终止进程
使用pkill命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“-t”(指定终端)等选项,使用起来非常方便。例如,若要终止由用户hackli启动的进程(包括登录Shell),可以执行以下操作。
[root@localhost~]#pgrep-1-U "hackli" //确认目标进程相关信息
3045 bash
[root@localhost ~]# pkill-9-U "hackli" //强行终止用户hackli的进程
[root@localhost~]# pgrep-1-U "hackli" //确认目标进程已被终止
5.计划任务管理
1.at 一次性任务设置
at [HH:MM] [yyyy-mm-dd]
Ctrl+D 提交任务
atq 查看未执行的任务列表
atrm 1 删除第1条任务
例如,以下操作先通过date命令确认当前的系统时间,并设置在2016年5月5
日的14:55分自动执行以下任务:统计该时间点系统中由root用户运行的进程的数量,
并将该数值保存到“/tmp/ps.root”文件中。
[root@kgc~]# date
2016年05月05日星期四 14:45:05 CST
[root@kgc~]# at 14:55 2016-05-05
at>pgrep-U root|wc-1>/tmp/ps.root
at><EOT> //任务设置完毕后按Ctrl+D组合键提交
job 1 at 2016-05-05 14:55
[root@kgc~]#cat/tmp/ps.root //等过了计划时间后验证命令结果
63
以下操作将设置一条计划任务,在当天的21:30时自动关闭当前系统。
[root@kgc~]# at 21:30
at>shutdown-h now
at><EOT>
job 2 at 2016-05-05 21:30
对于已经设置但还未执行(未到时间点)的计划任务,可以通过atq命令进行查询。
但已执行过的at任务将不会再出现在列表中。
[root@kgc~]#atq
2 2016-05-05 21:30 a root
若要删除指定编号的at任务,可以使用atrm命令。删除后的at任务将不会被执行,
并且不会显示在atq命令的显示结果中。但已经执行过的任务无法删除。
[root@kgc~]#atrm 2 //删除第2条at计划任务
[root@kgc~]#atq //确认第2条任务已被删除
2. crontab 周期性计划任务
- 按照预先设置的时间周期(分钟、小时、天、月、周)重复执行用户指定的命令操作
- 属于周期性计划任务
- 主要设置文件:
全局配置文件,位于文件∶ /etc/crontab
系统默认的设置,位于目录∶ /etc/cron.*/
用户定义的设置,位于文件∶/var/spool/cron/用户名
其中全局配置文件内容看一下:/etc/crontab
[root@kgc ~]# cat /etc/crontab
SHELL=/bin/bash //设置执行计划任务的Shell环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin //定义可执行命令及程序的路径
MAILTO=root //将任务输出信息发送到指定用户的邮箱
HOME=/ //执行计划任务时使用的主目录
# For details see man 4 crontabs
# Example of job definition:
# .----------------minute (0-59)
# | .-------------hour (0 -23)
# | | .---------- day of month(1-31)
# | | |.-------month(1- 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6)(Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
常用选项
- 编辑计划任务
Crontab -e 【-u 用户名】-u缺省时默认是针对当前用户 - 查看计划任务
crontab -I【-u 用户名】 - 删除计划任务
crontab -r 【-u 用户名】
crontab任务配置的格式
◾ 时间数值的特殊表示方法
- ***表示该范围内的任意时间
- ,表示间隔的多个不连续时间点
- -表示一个连续的时间范围
- /指定间隔的时间频率
◾ 应用示例
0 17 * *1-5 周一到周五每天17:00
30 8 * *1,3,5 每周一、三、五的8点30分
0 8-18/2 * * * 8点到18点之间每2小时
0 * * /3 * * 每3天