进程和计划任务

发布时间:2024年01月04日

文章目录

进程和计划任务

一、程序与进程的关系

1、程序

  • 保存在硬盘、光盘等介质中的可执行代码和数据

  • 执行特定任务的一串代码

2、进程

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体

  • 在CPU及内存中运行的程序代码
  • 动态执行的代码
  • 父、子进程
  • 每个程序可以创建一个或多个进程

进程是程序的副本,进程是有生命周期(运行状态,关闭状态)

2.1 进程的组成

进程一般由程序、数据集合和进程控制块三部分组成

  • 程序用于描述进程要完成的功能,是控制进程执行的指令集
  • 数据集合是程序在执行时所需要的数据和工作区
  • 程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志
2.2 进程的控制

每开启一个进程会消耗相应的硬件资源(如:内存,cpu,磁盘读写)

  • 内存不足时,关闭没有用的进程(跟开发沟通)

  • 硬件资源不足时,对进程进行清理

2.3 进程具有的特征
  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的
  • 并发性:任何进程都可以同其他进程一起并发执行
  • 独立性:进程是系统进行资源分配和调度的一个独立单位
  • 结构性:进程由程序、数据和进程控制块三部分组成

3、线程

  • 线程是操作系统能够进行运算调度的最小单位
  • 它被包含在进程之中,是进程中的实际运作单位
  • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并执行不同的任务
  • 线程之间交互多个线程共享同一块内存,通过共享的内存空间来进行交互
进程与线程的区别
  1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
  2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
  3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见
  4. 调度和切换:线程上下文切换比进程上下文切换要快得多

查看进程中的线程

如何确定一个程序是多线程还是单线程?

grep -i threads /proc/进程的PID/status    #查看程序的线程

prtstat  进程pid号|grep -i threads    #查看程序的线程

二、进程管理相关命令

系统中可以识别的信号较多,我们可以使用命令"kill -l"或"man 7 signal"来查询

号代号信号名称说 明
1SIGHUP该信号让进程立即关闭.然后重新读取配置文件之后重启
2SIGINT程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
3SIGQUIT退出
8SIGFPE在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9SIGKILL用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。一般用于强制中止进程
14SIGALRM时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15SIGTERM正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9
18SIGCONT该信号可以让暂停的进程恢复执行。本信号不能被阻断
19SIGSTOP该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

1、查看进程信息:PS命令

Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的文件中

1.1 ps aux:查看静态的进程统计信息
ps aux     #可以查看系统中所有的进程

ps -le     #可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
ps -l      #只能看到当前 Shell 产生的进程

ps axo pid,cmd,%mem,%cpu     #查看进程的特定属性

ps aux k -%cpu     #按CPU利用率倒序排序

dd if=/dev/zero of=/dev/null     #模拟cpu忙

a∶ 显示终端上的所有进程,包括其它用户的进程。与“x”选项结合时将示系统中所有的进程信息
u∶ 使用以用户为主的格式输出进程信息
x∶ 显示当前用户在所有终端下的进程信息
-e:显示系统内的所有进程信息。   
-l:使用长(Long)格式显示进程信息。
-f:使用完整的(Full)格式显示进程信
k|--sort: 属性 对属性排序,属性前加 - 表示倒序    ps aux k -%cpu
o:属性… 选项显示定制的信息 pid、cmd、%cpu、%mem

image-20240103102941923

各列的解释

  1. USER∶进程的用户
  2. PID∶进程的ID
  3. %CPU∶进程占用的CPU 百分比
  4. %MEM∶占用内存的百分比
  5. VSZ∶该进程使用的虚拟内存量(KB)
  6. RSS∶该进程占用的物理内存量(KB)
  7. TTY∶启动进程的终端名。不是从终端启动的进程则显示为 ?
  8. STAT∶该进程的状态(D∶不可中断的休眠状态;R∶正在运行状态;s∶处于休眠状态,可被唤醒;T∶停止状态,可能是在后台暂停或进程处于跟踪调试状态;z∶僵尸进程,进程已经中止,但是部分程序还在内存当中)
  9. START∶该进程被触发启动时间
  10. TIME∶该进程实际使用CPU运行的时间
  11. COMMAND∶进程的启动命令

僵尸进程

一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

僵尸进程命令过程

[root@localhost ~]# bash
[root@localhost ~]# echo $BASHPID
60403                                   #子进程
[root@localhost ~]# echo $PPID
57486                                   #父进程
[root@localhost ~]# kill -19 57486      #将父进程设为停止状态
[root@localhost ~]# kill -9 60403       #杀死子进程,使其进入僵尸态
已杀死
[root@localhost ~]# ps aux              #查看静态进程信息(60403 STAT为Z,表示为僵尸态)
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 193700  4804 ?        Ss   00:32   0:02 /usr/lib/systemd/systemd --switche
root          2  0.0  0.0      0     0 ?        S    00:32   0:00 [kthreadd]
root      57486  0.0  0.1 116048  2780 pts/1    Ts   08:26   0:00 -bash
root      60403  0.0  0.0      0     0 pts/1    Z+   13:39   0:00 [bash] <defunct>
[root@localhost ~]# kill -18 57486       #方法1:恢复父进程
[root@localhost ~]# kill -9 1436         #方法2:杀死父进程
[root@localhost ~]# ps aux               #查看静态进程信息(僵尸态的进程不存在了)
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 193700  4804 ?        Ss   00:32   0:02 /usr/lib/systemd/systemd --switche
root          2  0.0  0.0      0     0 ?        S    00:32   0:00 [kthreadd]
root      57486  0.0  0.1 116128  2796 pts/1    Ss+  08:26   0:00 -bash

僵尸进程命令(图文详解)

image-20240104135327706

image-20240104140431572

1.2 ps -elf:显示系统中的所有进程的详细信息
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head     #排序,查找占用最多内存的进程

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head     #排序,查找占用最多CPU的进程

ps axo pid,cmd,%cpu,%mem --sort %mem     #按内存倒序排序

ps -aT    #显示所有线程 
-a:显示所有进程的pid
-T:查看线程信息

image-20240103103054007

各列的解释

  1. F∶内核分配给进程的系统标记(常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限)

  2. S∶进程的状态

  3. UID∶启动这些进程的用户ID

  4. PID∶进程的ID

  5. PPID∶父进程的ID(如果该进程是由另一个进程启动的)

  6. C∶ 进程生命周期中的CPU利用率

  7. PRI∶进程的优先级 (数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改)

  8. NI∶ 进程的优先级,数值越小,该进程越早被执行;可以人为修改

    修改 NI 的值就可以改变进程的优先级。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。

    修改 NI 值时有几个注意事项:

    • NI 范围是 -20~19。
    • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
    • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
    • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
  9. ADDR∶进程的内存地址

  10. Sz∶该进程占用多大内存

  11. WCHAN∶该进程是否运行。"-"代表正在运行

  12. STIME∶ 进程启动时的系统时间

  13. TTY∶ 进程启动时的终端设备

  14. TIME∶ 该进程占用 CPU 的运算时间,注意不是系统时间

  15. CMD∶ 进程的启动命令

1.3 prtstat :查看进程信息
prtstat 1112     #查看1112进程信息

image-20240104150036897

2、查看进程信息:top命令

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为两部分:

  1. 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
  2. 第二部分从第六行开始,显示的是系统中进程的信息;
2.1 top常用选项
  1. -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
  2. -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
  3. -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
  4. -p 进程PID:仅查看指定 ID 的进程;
  5. -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
  6. -u 用户名:只监听某个用户的进程;

在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作

  1. ? 或 h:显示交互模式的帮助;
  2. p:按照 CPU 的使用率排序,默认就是此选项;
  3. c:切换显示命令名称和完整命令行
  4. M:按照内存的使用率排序;
  5. N:按照 PID 排序;
  6. T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
  7. k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
  8. r:按照 PID 给某个进程重设优先级(Nice)值;
  9. q:退出 top 命令;
  10. 数字1 键:显示CPU个数和状态
  11. top -H∶显示所有线程
  12. top -H -p ∶ 显示特定进程中的线程
2.2 格式:top( 动态的进程信息)

image-20240103142504165

第一行:任务队列信息

  1. 14:24:57—系统当前时间
  2. up 6:34—系统已运行时长
  3. 3 user —当前登录用户数
  4. load average:0.00,0.01, 0.0.5—系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟,5分钟,15分钟提前到现在的平均值

第二行:进程信息

  1. Tasks—总进程数
  2. running—正在运行的进数
  3. sleeping—休眠的进程数
  4. stopped—中止的进程数
  5. zombie—僵死的进程数,如果不是 0,则需要手工检查僵尸进程

第三行:CPU的信息

  1. us—用户占用
  2. sy—系统模式占用
  3. ni—优先级调度占用
  4. id—空闲CPU,要了解空闲的 CPU 百分比,主要看%id 部分
  5. wa—I/O 等待占用
  6. hi—硬件中断占用
  7. si—软件中断占用
  8. st—虚拟化占用

第四行:内存的信息

  1. total—总内存空间

  2. free—空闲内存

  3. used—己用内存

  4. buff/cache—物理内存和交换内存的缓冲区总和(读写缓存)

    缓冲(buffer)和缓存(cache)的区别:

    • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
    • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

    简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。

第五行:交换分区的信息

  1. total—总交换空间
  2. free—空闲交换空间
  3. used—已用交换空间
  4. avail Mem—可用物理空间
2.3 进程信息区各列解释

image-20240103103327787

  1. PID:进程ID
  2. USER:进程所有者的用户名
  3. PR:优先级,数值越小优先级越高
  4. Nl:谦让度值。 负值表示高优先级, 正值表示低优先级
  5. VIRT:进程使用的虚拟内存总量,单位kb
  6. RES:进程使用的物理内存大小,单位kb
  7. SHR:共享内存大小,单位kb S进程状态
  8. %CPU:上次更新到现在的CPU时间占用百分比
  9. %MEM :进程使用的物理内存百分比
  10. TIME+:进程使用的CPU时间总计,单位1/100秒
  11. COMMAND:命令名/命令行

3、查看指定的进程信息:pgrep命令

  • 格式:pgrep -l 进程关键字 显示进程号和进程名
3.1 常用选项
-U:指定用户
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程

pidof nginx     #查看nginx进程的pid号(已知程序名,不知道pid号)

4、查看进程树:pstree命令

  • 以树形结构列出进程信息

格式:pstree -aup

常用选项:
-a	显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程

pstree -ap 用户名 只查看属于指定用户的进程树结构

image-20240103103534615

5、查看系统中已经被打开的文件列表:lsof

格式:lsof [选项]

选项功能
-c 字符串只列出以字符串开头的进程打开的文件
+d 目录名列出某个目录中所有被进程调用的文件
-u 用户名只列出某个用户的进程打开的文件
-p pid列出某个 PID 进程打开的文件

6、内存:free

free  -h   #查看内存使用情况

free  -m   #以m为单位查看内存使用情况

echo 3 > /proc/sys/vm/drop_caches    #清除缓存

pmap 1073     #查看进程占用内存的详细信息

7、iostat

  • iostat 可以提供更丰富的IO性能状态数据
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标

8、其他相关命令

iotop  #监视磁盘I/O

iftop -ni ens33  #网络流量

uptime #系统运行了多久时间

mpstat  #显示CPU相关统计

dstat  #系统资源统计

三、进程控制

1、进程的启动方式

1.1 手动启动
  • 前台启动:用户输入命令,直接执行程序

  • 后台启动:在命令行尾加入“&”符号,输出信息中包括后台任务序号、PID号

1.2 调度启动
  • 使用at命令,设置一次性计划任务

  • 使用crontab命令,设置周期性计划任务

1.3 进程的前后台调度
  • “命令后跟&”,把命令放入后台执行

  • Ctrl+Z组合键:将当前的进程挂起,即调入后台并停止执行

image-20240103104025655

  • 查看后台任务列表 jobs

    jobs -l :查看处于后台的任务列表

image-20240103135718673

  • 调出后台任务 fg

    将后台的进程恢复到前台运行,可指定任务序号,不指定任务序号表示所有后台任务全部恢复至前

image-20240103140524467

  • 并行执行任务,命令之间用“&”连接

    如:ping 127.0.0.1&ping 127.0.0.2&ping 127.0.0.3&

2、终止进程的运行

信号编号信号名含义
0EXIT程序退出时收到该信息
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化
2INT表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号
3QUIT退出
9KILL杀死进程,即强制结束进程
11SEGV段错误
15TERM正常结束进程,是 kill 命令的默认信号
2.1 Ctrl+C组合键
  • 中断正在执行的命令
2.2 kill、killall命令
killall [选项] [信号] 进程名

killall -i sshd    #交互杀死 sshd
  • kill用于终于指定PID号的进程

  • killall用于终止指定名称相关的所有进程

  • -9选项用于强制终止

2.3 pkill命令
  • 根据特定条件终止相应的进程
pkill [信号] 进程名

-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应程序

四、at命令设置计划任务

1、at命令:一次性计划任务

2、一次性任务创建步骤

第一步:at [HH:MM] [yyyy-mm-dd] 不携带日期表示为当天

第二步:输入指定命令

第三步:Ctrl+D提交任务

3、atq命令

  • 查看未执行的任务列表

4、atrm命令

  • 删除指定未执行任务

  • 格式:atrm 任务序号

五、crontab计划任务配置

1、crontab命令

1.1 按照预先设置的时间周期(分钟、小时、日、月、周)重复执行用户指定的命令操作
1.2 属于周期性计划任务
1.3 主要设置文件
  • 全局配置文件,位于文件:/etc/crontab

  • 系统默认的设置,位于目录:/etc/cron.*/

  • 用户定义的设置,位于文件:/var/spool/cron/用户名

2、管理cronta计划任务

选项功能
-u user用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行
-e编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件
-l显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容
-r从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件
-i在删除用户的 crontab 文件时,给确认提示
2.1 编辑计划任务
  • crontab -e [-u 用户名] -u缺省时默认是针对当前用户
2.2 查看计划任务
  • crontab -l [-u 用户名]
2.3 删除计划任务
  • crontab -r [-u 用户名]

3、crontab任务配置的格式

3.1 格式:时间周期设置 任务内容设置
  • 时间周期设置:分钟 小时 日期 月份 星期

  • 任务内容设置:命令或者脚本文件

    项目含义范围
    第一个"*"一小时当中的第几分钟(minute)0~59
    第二个"*"一天当中的第几小时(hour)0~23
    第三个"*"一个月当中的第几天(day)1~31
    第四个"*"一年当中的第几个月(month)1~12
    第五个"*"一周当中的星期几(week)0~7(0和7都代表星期日)
3.2 时间数制的特殊表示方法
特殊符号含义
*(星号)代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思
,(逗号)代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令
-(中杠)代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令
/(正斜线)代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令
3.3 应用示例
  • 0 17 * * 1-5 周一到周五每天17:00
  • 30 8 * * 1,3,5 每周一、三、五的8:30分
  • 0 8-18/2 * * * 8点到18点之间每2小时
  • 0 * */3 * * 每3天
3.4 crontab 任务配置

image-20240103140652223

crontab -e [-u root] 编辑 一个计划任务

  • 每分钟定时执行一次规则

    每一分钟执行:*/1 * * * *或者 * * * * *

    每五分钟执行: */5 * * * *

  • 每小时定时执行一次规则

    每小时执行:0 * * * * 或者 0 */1 * * *

    每天上午七点执行:0 7 * * * *

    每天上午七点十分执行: 10 7 * * *

  • 每天定时执行一次规则

    每天执行:0 0 * * *

  • 每周定时执行一次规则

    每周执行:0 0 * * 1

  • 每月定时执行一次规则

    每月执行: 0 0 1 * *

  • 每年定时执行一次规则

    每年执行: 0 0 1 1 *

3.5 其他例子
  • 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 6 * * 0 ls — 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
  • 30 3 10,20 * * ls — 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
  • 25 8-11 * * * ls — 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
  • */15 * * * * ls — 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
  • 30 6 */10 * * ls — 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令]

4、设置周期任务的方法

4.1 crontab -e编辑
  • 30 1 * * * /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d) 每天1点半将系统日志复制到root目录下并重命名为log加日期标注

  • 常用日期表达命令

? date +%F显示格式为YYYY-MM-DD

? date +%Y%m%d显示格式为YYYYMMDD

4.2 echo重定向追加

echo ‘30 1 * * * /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d)’ >> /var/spool/cron/root

4.3 vim /etc/crontab编辑

此方法需指定执行任务的用户,且无法通过crontab命令进行查看、编辑以及删除,如需操作需进入/etc/crontab,编辑格式如下:

30 1 * * * root /usr/bin/cp -a /var/log/messages /root/log-$(date +%Y%m%d)

文章来源:https://blog.csdn.net/2301_81272194/article/details/135390724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。