目录
一、程序与进程的关系
1.1 程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 文件中静态保存的代码
1.2 进程
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 父 、子进程
- 每个程序可以创建一个或者多个进程
二、查看进程
2.1 ps命令----查看静态的进程统计信息
2.1.1 ps -aux
a:显示终端bai上的所有进程,包括其它用户的进程
u:表示列出进程的用户
x:显示所有终端的进程。
示列及解释
[root@linianhui ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 194184 7308 ? Ss 8月11 0:08 /usr/lib/systemd/syste
root 2 0.0 0.0 0 0 ? S 8月11 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 8月11 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 8月11 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 8月11 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 8月11 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 8月11 0:23 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 8月11 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 8月11 0:00 [watchdog/0]
###各列的解释
USER: 进程的用户。
PID: 进程的ID
%CPU: 进程占用的CPU百分比。
%MEM: 占用内存的百分比。
VSZ: 该进程使用的虚拟内存量(KB)
RSS: 该进程占用的物理内存量(KB)。
TTY: 启动进程的终端名。不是从终端启动的进程则显示为?
STAT:该行程的状态(D:不可中断的休眠状态;R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态;Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)
扩展:
僵尸进程:
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
2.1.2 ps -elf
-e : 显示系统内的所有进程信息
-l: 使用长格式显示进程信息
-f: 使用完整的格式显示进程信息
示列
[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 - 48480 ep_pol 11:14 ? 00:00:03 /usr/lib/sys
1 S root 2 0 0 80 0 - 0 kthrea 11:14 ? 00:00:00 [kthreadd]
1 S root 4 2 0 60 -20 - 0 worker 11:14 ? 00:00:00 [kworker/0:0
1 S root 6 2 0 80 0 - 0 smpboo 11:14 ? 00:00:00 [ksoftirqd/0
1 S root 7 2 0 -40 - - 0 smpboo 11:14 ? 00:00:00 [migration/0
1 S root 8 2 0 80 0 - 0 rcu_gp 11:14 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 11:14 ? 00:00:12 [rcu_sched]
1 S root 10 2 0 60 -20 - 0 rescue 11:14 ? 00:00:00 [lru-add-dra
5 S root 11 2 0 -40 - - 0 smpboo 11:14 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 -40 - - 0 smpboo 11:14 ? 00:00:00 [watchdog/1]
1 S root 13 2 0 -40 - - 0 smpboo 11:14 ? 00:00:01 [migration/1
1 S root 14 2 0 80 0 - 0 smpboo 11:14 ? 00:00:00 [ksoftirqd/1
1 S root 16 2 0 60 -20 - 0 worker 11:14 ? 00:00:00
### 各列的解释
F:内核分配给进程的系统标记。
S:进程的状态。
UID: 启动这些进程的用户
PID: 进程的进程ID。
PPID: 父进程的进程号(如果该进程是由另一个进程启动的)
C: 进程生命周期中的CPU利用率。
PRI: 进程的优先级(越大的数字代表越低的优先级)
NI: 谦让度值用来参与决定优先级。
ADDR: 进程的内存地址。
SZ: 假如进程被换出,所需交换空间的大致大小。
WCHAN: 若该进程在睡眠,则显示睡眠中的系统函数名,
STIME: 进程启动时的系统时间。
TTY: 进程启动时的终端设备。
TIME: 运行进程需要的累计CPU时间。
CMD: 进程的启动命令。
2.2 top命令 ----查看进程的动态信息
示列
[root@localhost ~]# top
top - 16:47:56 up 5:33, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 245 total, 1 running, 244 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7990076 total, 4716052 free, 570816 used, 2703208 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 7126040 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 root 20 0 0 0 0 S 0.3 0.0 0:12.94 rcu_sched
1013 root 20 0 324784 6924 5404 S 0.3 0.1 0:19.77 vmtoolsd
78868 root 20 0 0 0 0 S 0.3 0.0 0:01.03 kworker/4:1
128447 root 20 0 162260 2408 1580 R 0.3 0.0 0:00.09 top
1 root 20 0 193920 9120 4184 S 0.0 0.1 0:03.78 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.10 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.11 migration/0
###解析
第一行是任务队列信息
16:47:56 系统时间
up 5:33 系统运行时长
1 user 当前登录用户数
load acerage:0.00,0.01,0.05 系统负载,单位时间内系统处理的任务数,后面三个数值分别为1分钟、五分钟、十五分钟到现在的平均值
第二行是进程信息
Task 总进程数
running 正在运行的进程数
sleeping 休眠的进程数
stopped 中止的进程数
zombie 僵死的进程数
第三行为CPU的信息
us 用户占用
sy 内核占用
ni 优先级调度占用
id 空闲的CPU,要了解空闲的的CPU百分比,主要看%id 部分
wa I/O 等待占用
hi 硬件中断占用
si 软件中断占用
st 虚拟化占用
第四行为内存信息
total 总内存空间
free 空闲内存
used 已用内存
buff/cache 物理内存和交换内存的缓冲区总和
第五行为交换空间信息
total 总交换空间
free 空闲交换空间
used 已用交换空间
avail Mem 可用物理空间
重点注意
load average 系统CPU负载情况
1min ago 5min ago 15 min ago
三个点相连 15分钟到现在的系统负载情况>>
当下及未来的时间内,我的系统CPU资源是否吃紧,是否有隐患,同时也是作为优化、监控预处理的依据
top常用命令
c 键:根据CPU使用百分比大小进行排序
q 键:退出top程序
数字1键:显示CPU个数和状态
2.3 pgrep命令-----查看进程信息
pgrep:
pgrep是一个用于查找进程ID(PID)的命令行工具,它可以根据进程的名字或其他属性来查找对应的PID。pgrep命令通常与其他命令一起使用,如 kill 命令
常用选项
-a:显示进程名和PID
-c:仅显示匹配进程的数量,而不显示进程名和PID
-f:匹配进程名及参数
示列
[root@localhost ~]# pgrep -a ssh #查看sshd进程的pid
1437 /usr/sbin/sshd -D
2443 sshd: root@pts/0
2449 sshd: root@notty
2.4 jobs命令-----列出后台进程的状态信息
常用选项
选项 | 说明 |
-l | 显示所有后台进程PID |
-p | 显示所有后台进程的进程组ID |
-n | 仅显示最近的后台进程 |
-r | 仅显示正在运行的后台进程 |
-s | 仅显示已停止的后台进程 |
2.5 pstree命令--------查看进程树
以树形结构列出进程信息
pstree -aup
[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 22
├─ModemManager,944
│ ├─{ModemManager},966
│ └─{ModemManager},996
├─NetworkManager,1122 --no-daemon
│ ├─{NetworkManager},1127
│ └─{NetworkManager},1131
├─VGAuthService,1010 -s
##############################
-a:显示完整信息
-u:列出对应用户名
-p:列出对应PID号
三、控制进程
3.1 进程的前后台调度
3.1.1 Ctrl +Z 组合键
- 将当前进程挂起,即调入后台并停止执行
3.1.2 jobs命令
- jobs 【-l】
- 查看处于后台的任务列表
3.1.3 fg命令
- 将后台进程恢复到前台运行,可指定任务序号
3.2 终止进程运行
3.2.1 Ctrl + C 组合键
- 中断正在执行的命令
3.2.2 kill、killall命令
- kill用于终止指定PID号的进程
- killall用于终止指定名称相关的所有进程
- -9选项用于强行终止
我们经常会用到kill命令去杀死一个进程,但是有时会出现kill不成功的现象,这是就要用到kill -9
之所以这两个命令会有区别是因为所发送的信号(Siqna)是不同的。默认情况下kil命令的参数为-15。
kill -15代表的信号为SIGTERM,这是告诉进程你需要被关闭,请自行停止运行并退出
而kill -9代表的信号是SIGKILL,表示进程被终止,需要立即退出,因此ki -9表示强制杀死该进程,这个信号不能被捕获也不能被忽略
3.2.3 pkill命令
- 根据特定条件终止响应进程
- 常用命令选项
- -U:根据进程所属的用户名终止相应进程
- -t:根据进程所在的终端终止相应进程
[root@localhost ~]# pgrep -l -U "teacher"
3045 bash
[root@localhost ~]# pkill -9 -U " teacher"
[root@localhost ~]# pgrep -l -U " teacher"
四、计划任务管理
4.1 at命令 -----一次性计划任务
at [HH:MM] [yyyy-mm-dd]
示列
在当天的21:30时自动关闭当前系统
[root@localhost ~]# at 21:30 #不携带日期表示当天
at> shutdown -h now
at><EOT> #按ctrl + D键提交任务
job 2 at Sun May 7 21:30:00 2017
4.2 crontab命令-----周期性执行任务
- 按照预先设置的时间周期(分钟、小时、天、月、周)重复执行用户指定的命令操作
- 属于周期性计划任务
- 主要设置文件
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
4.2.1 管理crontab计划任务
- 编辑计划任务
crontab -e [-u 用户名]
- 查看计划任务
crontab -l [-u 用户名]
- 删除计划任务
crontab -r [-u 用户名]
crontab -l -u 展示当前设定的定时任务
crontab -r -u 删除所有定时任务----使用时慎重
4.3 crontab 任务配置的格式
50 3 2 1 * run_command
分钟 小时 日期 月份 日期 命令或者脚本文件
字段 | 说明 |
分钟 | 取值为从0到59之间的任意整数 |
小时 | 取值为从0到23之间的任意整数 |
日期 | 取值为从1到31之间的任意整数 |
月份 | 取值为从1到12之间的任意整数 |
星期 | 取值为从0到7之间的任意整数,0或7代表星期日 |
命令 | 要执行的命令或者程序脚本 |
4.3.1 时间数值的特殊表示方法
- "*" 表示该范围内任意时间
- ","表示间隔的多个不连续时间点
- "-" 表示一个连续的时间范围
- "/" 指定间隔的时间频率
4.3.2 应用示列
每分钟定时执行一次规则:
每1分钟执行: */1 * * * *或者* * * * *
每5分钟执行: */5 * * * *
每天定时执行一次规则:
每天执行0 0 * * * --每天的24点执行
每周定时执行一次规则:
每周执行0 0 * * 1 --每周的第一天,24点,执行
5 * * * * |s 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 6 */10* * |s 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。
注意
命令或者脚本要写绝对了路径 可以用which 查询命令的绝对路径