文章目录
- Linux:进程与计划任务
- 一、进程
- 1、进程是什么
- 2、进程状态
- 二、列出进程命令
- 1、查看静态的进程统计信息——“ps”
- Play1:“ps aux”
- Play2:ps -elf
- 2、查看静态的进程统计信息——“top”
- 段首解析
- 进程信息区解释
- 三、运行与终止进程
- 3.1、运行进程
- 3.2、进程前后台调度
- 3.3、使用信号控制进程
- 3.4、终止进程
- 四、计划任务
- 一次性计划任务——at
- 周期性计划任务——crond
Linux:进程与计划任务
一、进程
1、进程是什么
进程的定义:进程是已启动的可执行程序的运行中实例。
-
进程由以下组成部分:
-
已分配内存的地址空间
-
安全属性,包括所有权凭据和特权
-
程序代码的一个或多个执行线程
-
进程状态
-
-
进程的环境包括:
-
本地和全局变量
-
当前调度上下文
-
分配的系统资源,如文件描述符和网络端口
-
进程上下文:当一个进程从内核中移出,另一个进程成为活动的, 这些进程之间便发生了上下文切换。 操作系统必须记录重启进程和启动新进程使之活动所需要的所有信息。这些信息实际上是进程执行活动过程的描述信息,称作上下文。
现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。每个新进程分配有一个唯一进程 ID(PID),满足跟踪和安全性之需。PID和父进程ID(PPID) 是新进程环境的元素。任何进程可创建子进程。所有进程都是第一个系统进程的后代,Linux系统上,第一个系统进程是systemd。
2、进程状态
在多任务处理操作系统中,每个CPU(或 CPU核心)在一个时间点上处理一个进程。在进程运行时,它对 CPU 时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。
在单CPU系统上,一次只能运行一个进程。可以看到状态为R的几个进程。但是,并非所有进程都连续运行,其中一些进程处于状态等待状态。
名称 | 标志 | 内核定义的状态名称和描述 |
---|---|---|
Running | R | TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪。 |
Sleeping | S | TASK_INTERRUPTIBLE:进程正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中。 |
Sleeping | D | TASK_UNINTERRUPTIBLE:此进程也在睡眠,与S状态不同,不会响应信号。进程中断可能会导致意外设备状态的情况。 |
Sleeping | K | TASK_KILLABLE:与不可中断的D状态相同,但有所修改,允许等待中的任务响应要被中断(彻底退出)的信号。实用程序通常将可中断的进程显示为D状态。 |
Sleeping | I | TASK_REPORT_IDLE:D状态的一个子集。在计算负载平均值时,内核不会统计这些进程。用于内核线程。设置了TASK_UNINTERRUPTABLE和TASK_NOLOAD标志。它接受致命信号。 |
Stopped | T | TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复)。 |
Stopped | t | TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标。 |
Zombie | Z | EXIT_ZOMB:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释。 |
Zombie | X | EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到。 |
二、列出进程命令
1、查看静态的进程统计信息——“ps”
ps命令选项包括两部分:限定查看哪些进程和对选定的进程查看他们哪些属性。
ps 命令支持三种选项格式
-
BSD选项,可以分组但不可与短划线同用;不使用-
-
UNIX(POSIX)选项,可以分组但必须以短划线开头;使用单个-
-
GNU长选项,以双短划线开头;使用两个–
Play1:“ps aux”
选项 | 解释 |
---|---|
a | 显示现行终端下的所有进程,包括其它用户的进程。 |
u | 显示进程的归属用户及内存的使用情况。 |
x | 显示所有终端的进程。 |
h | 不显示标题列。 |
列名 | 描述 |
---|---|
USER | 进程的用户。 |
PID | 进程的ID。 |
%CPU | 进程占用的CPU百分比,占用越高,进程越耗费资源。 |
%MEM | 占用内存的百分比。 |
VSZ | 该进程使用的虚拟内存量(KB)。 |
RSS | 该进程占用的实际物理内存量(KB)。 |
TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? |
STAT | 该进程的状态 |
START | 该进程被启动时间。 |
TIME | 该进程实际使用CPU的时间。 |
COMMAND | 进程的名称与参数 |
Play2:ps -elf
选项 | 解释 |
---|---|
-e | 显示系统内的所有进程信息。 |
-l | 使用长格式显示进程信息。 |
-f | 使用完整的格式显示进程信息。 |
-a | 显示现行终端下的所有进程。 |
-T | 查看线程信息。 |
-C <进程名称> | 显示指定进程名的信息。 |
-p <进程pid> | 显示指定pid的进程的信息。 |
-H | 显示树状结构,表示进程间的相互关系。 |
–no-headers | 不显示标题列。 |
列名 | 描述 |
---|---|
F | 内核分配给进程的系统标记。 |
S | 进程的状态。 |
UID | 启动这些进程的用户。 |
PID | 进程的进程ID。 |
PPID | 父进程的进程号(如果该进程是由另一个进程启动的)。 |
C | 进程生命周期中的CPU利用率。 |
PRI | 进程的优先级(越大的数字代表越低的优先级)。 |
NI | 谦让度值用来参与决定优先级。 |
ADDR | 进程的内存地址。 |
SZ | 假如进程被换出,所需交换空间的大致大小。 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名。 |
STIME | 进程启动时的系统时间。 |
TTY | 进程启动时的终端设备。 |
TIME | 运行进程需要的累计CPU时间。 |
CMD | 进程的启动命令。 |
2、查看静态的进程统计信息——“top”
选项 | 描述 |
---|---|
P | 根据CPU使用百分比大小进行排序 |
M | 根据启动时间进行排序 |
N | 根据启动时间进行排序 |
c | 切换显示命令名称和完整命令行 |
h | 可以获得 top程序的在线帮助信息 |
k | 根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程 |
q | 退出 top 程序 |
1 | 显示CPU个数和状态 |
段首解析
top - 18:58:48 up 1:51, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 298 total, 1 running, 297 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
MiB Mem : 3615.9 total, 2266.4 free, 1021.0 used, 574.3 buff/cache
MiB Swap: 8028.0 total, 8028.0 free, 0.0 used. 2594.8 avail Mem
- 第一行:任务队列信息
18:58:48 ##系统时间
up 1:51 ##系统已运行时长
1 user ##当前登录用户数
load average: 0.00, 0.00, 0.00 ##系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
- 第二行:进程信息
Tasks##总进程数
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 ##可用物理空间
进程信息区解释
列名 | 描述 |
---|---|
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | 谦让度值。负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb |
RES | 进程使用的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
S | 进程状态 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
三、运行与终止进程
3.1、运行进程
前台进程:在命令行输入命令,直接运行;一个终端中只有一个前台进程,该进程可以终端窗口中读取输入和响应键盘生成的信号。
后台进程:在命令末尾追加 & 符号。;在后台运行的进程,该进程不能从终端读取输入或接收键盘产生的中断。后台进程可能暂停,也可能正在运行。如果正在运行的后台作业尝试从终端读取,它将自动暂停。
3.2、进程前后台调度
-
ctrl + z #将前台进程挂起暂停并调入到后台
-
jobs -l #查看挂起调度到后台的进程列表和序号
-
fg <序号> #将挂起到后台的进程调度到前台继续运行
3.3、使用信号控制进程
生成信号(signal)的事件可以是错误,外部事件或者使用信号发送命令或键盘序列。
信号编号 | 端名称 | 定义 | 用途 |
---|---|---|---|
1 | HUP | 挂起 | 用于报告终端控制进程的终止,也用于请求进程重新初始化(重新加载配置)而不终止。 |
2 | INT | 键盘中断 | 导致程序终止。可以被拦截或处理。通过按键序列(Ctrl+c)发送。 |
3 | QUIT | 键盘退出 | 与INT相似:在终止时添加进程转储。通过按键序列(Ctrl+)发送。 |
9 | KILL | 中断,无法拦截 | 导致立即终止程序。无法被拦截、忽略或处理;总是致命的。 |
15 | TERM | 终止 | kill相关命令,默认信号,导致程序终止。和KILL不同,可以被拦截、忽略或处理。要求程序终止的“友好”方式;允许自我清理。 |
18 | CONT | 继续 | 发送至进程使其恢复(若已停止)。无法被拦截。即使被处理,也始终恢复进程。 |
19 | STOP | 停止,无法拦截 | 暂停进程。无法被拦截或处理。 |
20 | TSTP | 键盘停止 | 和ST0P不同,可以被拦截、忽略或处理。通过按SUSP键序列(Ctrl+z)发送。 |
3.4、终止进程
-
kill
-
killall <进程名>
-
pkill <关键词> -U <用户名> -t <终端>
kill是如何杀掉进程的: 向进程发送信号的方式杀掉进程
kill 参数
kill 默认选项为 -15 :发送信号 SIGTERM,表示告诉进程自行停止运行并退出,进程可以忽略
这种方式可能会存在一些问题:进程的子进程可能会无法终止,并继续消耗系统资源
kill -9 :发送信号 SIGKILL,表示进程要立即退出,且不能被捕捉或忽略
kill -3:发送信号 SIGQUIT,表示进程自行退出,并打印进程各个线程的堆栈信息,保存路径为 /proc/${pid}/cwd,文件名为 antBuilderOutput.log
kill -1:发送信号 SIGHUP,表示进程重新加载配置文件,不退出
四、计划任务
一次性计划任务——at
at是Linux中调度未来工作的一种解决方案。at不是一个单独的工具,包括系统后台进程(atd)和一系列的命令(例如at atq等等)与后台进程atd交互。
atd提供26个队列,a到z,排的越后优先级越低。使用at命令排队调度jobs。
语法:at
-
at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。
-
对于大量的命令或者错字敏感的命令,可以通过重定向从脚本中读取,例如at now +5min < myscript,也可以使用-f file 从特定文件中读取。
timespec允许多种时间组合。典型的时间,02:00pm,15:43,或者teatime,后接日期或
未来的天数。
周期性计划任务——crond
crond守护进程会读取多个配置文件(每个用户对应一个配置文件),以及针对系统周期性作业的配置文件。
-
普通用户可以使用crontab命令管理自己的周期性作业。
-
root用户可以使用参数-u username管理其他用户周期性作业。
语法:crontab -e [-u username]
每一个jobs包涵6个部分,时间和执行的命令内容。前五个是时间,最后一个是执行的命令。
crontab文件中的字段按以下顺序显示:
- 分钟
- 小时
- 几号
- 月
- 星期几
- 命令
字段 | 含义 | 例如 |
---|---|---|
* | 任意时间点 | |
, | 多个不连续的时间点 | “1,7”表示1或7 |
- | 连续的时间点 | “1-7”表示1至7 |
/ | 间隔的时间频率 | “*/7”表示每隔7 |
基本命令
命令 | 用途 |
---|---|
crontab -l | 列出当前用户的计划作业 |
crontab -r | 删除当前用户的所有作业 |
crontab -e | 编辑当前用户的作业 |
crontab filename | 删除所有作业,并替换为从filename读取的作业。如果没有指定文件,则使用stdin |
例:配置 cron 作业,该作业每隔 2 分钟以 natasha 用户身份执行以下命令:强制复制/var/log/目录到/opt/
# 验证crond服务状态
[root@servera ~]# systemctl is-enabled crond.service
enabled
[root@servera ~]# systemctl is-active crond.service
active
# 添加cron作业,内容格式可以参考/etc/crontab
[root@servera ~]# crontab -u natasha -e
*/2 * * * * logger "EX200 in progress"
# 验证文件内容
[root@servera ~]# crontab -u natasha -l
*/2 * * * * \cp -f -r /var/log/ /opt/
g/目录到/opt/
```bash
# 验证crond服务状态
[root@servera ~]# systemctl is-enabled crond.service
enabled
[root@servera ~]# systemctl is-active crond.service
active
# 添加cron作业,内容格式可以参考/etc/crontab
[root@servera ~]# crontab -u natasha -e
*/2 * * * * logger "EX200 in progress"
# 验证文件内容
[root@servera ~]# crontab -u natasha -l
*/2 * * * * \cp -f -r /var/log/ /opt/