进程和计划任务管理

Linux进程与线程管理:监控、分析和调度
本文详细介绍了Linux系统中的程序、进程和线程概念,包括进程的动态性、并发性和独立性,以及如何使用ps、top、lsof、vmstat等命令查看和管理进程。同时,讨论了进程的状态,如僵尸进程,以及如何通过kill、killall、pkill命令结束进程。最后,提到了at和crontab命令用于设置一次性及周期性计划任务。

一 程序的概念

是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具

用于描述进程要完成的功能,是控制进程执行的指令集

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

静态保存的代码

二 进程的概念

运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

在CPU及内存中运行的程序代码
动态执行的代码
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
都由其父进程创建

父进程与子进程

父进程复制自己的地址空间(fork派生)创建一个新的(子)进程结构

每个进程分配一个唯一的进程ID(PID),满足跟踪安全性之需

任何进程都可以创建子进程

所有进程都是第一个系统进程的后代

进程具有的特征

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

 僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。

三  线程的概念

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

查看进程有几个线程,可以使用 "cat /proc/PID/status"查看

四 查看进程

4.1    ps命令——静态查看进程    (Process Status)

ps [option]...

  • a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
  • u:使用以用户为主的格式输出进程信息。
  • x:显示当前用户在所有终端下的进程信息。
  • -e:显示系统内的所有进程信息。
  • -l:使用长(Long)格式显示进程信息。
  • -f:使用完整的(Full)格式显示进程信
  • k|--sort 属性:对属性排序,属性前加 - 表示降序排列。

举例说明:

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

4.1.1 ps aux

表头(列名)含义
USER该进程是由哪个用户产生的
PID进程的 ID
%CPU该进程占用 CPU 资源的百分比
%MEM该进程占用物理内存的百分比
VSZ该进程占用虚拟内存的大小,单位为 KB
RSS该进程占用实际物理内存的大小,单位为 KB
TTY

该进程是在哪个终端运行的  tty1~tty6 是本地的字符界面终端,tty7 是图形终端

 pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端

STAT进程状态
START该进程的启动时间
TIME该进程占用 CPU 的运算时间
COMMAND产生此进程的命令名。

STAT进程状态描述
-D不可被唤醒的睡眠状态,通常用于 I/O 情况
 -R该进程正在运行
-S该进程处于睡眠状态,可被唤醒
 -T停止状态,可能是在后台暂停或进程处于除错状态
 -W内存交互状态
-X死掉的进程(应该不会出现)
 -Z僵尸进程。进程已经中止,但是还是占用硬件资源
 -<高优先级
 -N低优先级
 -L被锁入内
-s包含子进程
-l多线程(小写 L)
 -+进程位于后台

4.1.2 ps -lef 命令查看进程信息

表头(列名)含义
F程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限
S进程状态
UID运行此进程的用户的 ID
PID进程的 ID
PPID父进程的 ID
C该进程的 CPU 使用率,单位是百分比
PRI进程的优先级,数值越小,该进程的优先级越高
NI谦让度值
ADDR该进程在内存的哪个位置
SZ该进程占用多大内存
WCHAN若睡眠 系统显示的函数名
TTY该进程由哪个终端产生
TIME该进程占用 CPU 的运算时间,注意不是系统时间
STIME进程启动的系统时间
CMD产生此进程的命令名

4.1.3 自定义显示字段(查看进程的特定属性)

ps axo 列名,列名,列名...

4.1.4 进程排序

 ps aux --sort=列名(列名前有“-”表示降序)

4.2 top命令——动态查看进程

选项描述
-d指定 top 命令每隔几秒更新。默认是 3 秒
-b使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中
-n次数:指定 top 命令执行的次数。一般和"-"选项合用
-p进程PID:仅查看指定 ID 的进程
-s使 top 命令在安全模式中运行,避免在交互模式中出现错误
-u用户名:只监听某个用户的进程

交互操作选项描述
? 或 h显示交互模式的帮助
c按照 CPU 的使用率排序,默认就是此选项
M按照内存(memory)的使用率排序
N按照 PID 排序
T按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排
k按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号
q退出 top 命令

实例:

  [root@localhost ~]# top -d 10    //每10秒刷新一次
 ​ [root@localhost ~]# top -d 10 -n 5   //每10秒刷新一次,只执行5次,刷新5次后自动退出
 ​ [root@localhost ~]# top -p 655,1120   //查看PID为655和1120的进程
 ​ [root@localhost ~]# top -u nancy     //查看nancy用户的进程

4.2.1 top命令输出内容

 (1)第一行是 任务队列信息

内 容说 明
06:04:01系统当前时间
up 2:21系统的运行时间。本机己经运行 2小时21分钟
5 user当前登录了5个用户
load average: 0.00, 0.01, 0.05系统在之前 1 分钟、5 分钟、15 分钟的平均负载 。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)

(2)第二行是进程信息

内 容 Tasks:说 明
194 total系统中的进程总数
1 running正在运行的进程数
193 sleeping睡眠的进程数
0 stopped停止(暂停)的进程数
0 zombie僵尸进程数

(3)第三行是 CPU 信息

内 容%Cpu(s):说 明
0.1 us用户模式占用的 CPU 百分比
0.1 sy,系统模式占用的 CPU 百分比
0.0 ni优先级调度占用
99.9 id空闲 CPU 占用的 CPU 百分比
0.0 wa等待输入/输出的进程占用的 CPU 百分比/磁盘读写性能  iostat--查看读写性能
0.0 hi硬中断请求服务占用的 CPU 百分比 /1分钟的cpu使用率
0.0 si软中断请求服务占用的 CPU 百分比/5分钟的cpu使用率
0.0 stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 /15分钟的cpu使用率

4)第四行是物理内存信息

内 容说 明
KiB Mem : 1867048 total物理内存的总量,单位为KB

90384 free

空闲的物理内存数量
891196 used已使用的物理内存数量
885468 buff/cache作为缓冲的内存数量   /物理内存和交换内存的缓冲区总和

5)第五行是交换分区(swap)信息

内 容 KiB Swap:说 明
2097148total交换分区(虚拟内存)的总大小,单位KB
2075128 free空闲交换分区的大小
22020 used.已使用的交换分区的大小
739968 avail Mem可用于进程下一次分配的物理内存数量(可用物理空间)

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

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

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

4.2.3 top命令输出内容——第二部分详解

表头(字段名)说明
PID进程的 ID号
USER该进程所属的用户
PRpriority优先级,数值越小 优先级越高
NI谦让度值
VIRT该进程使用的虚拟内存的大小,单位为 KB
RES该进程使用的物理内存的大小,单位为 KB
SHR共享内存大小,单位为 KB
S进程状态
%CPU该进程占用 CPU 的百分比
%MEM该进程占用内存的百分比
TIME+该进程总共占用的 CPU 时间
COMMAND进程的命令名(进程文件、进程名称

4.3 pgrep命令——查询进程的PID

根据特定条件查询进程的PID信息

  • -U:指定用户
  • -l:显示进程名
  • -a:显示完整格式的进程名
  • -P < PID>:显示指定进程的子进程

 

4.4 prtstat命令——查看指定的进程

命令格式:prtstat [options] PID

4.5 pstree命令——以树形结构列出进程信息

pstree  [OPTION] [ PID | USER ]

常用选项:

-a    显示每个程序的完整指令,包含路径,参数或是常驻服务的标示
-c    不使用精简标示法
-G    使用 VT100 终端机的列绘图字符
-h    列出树状图时,特别标明现在执行的程序
-H <程序识别码>    此参数的效果和指定 -h 参数类似,但特别标明指定的程序
-l    采用长列格式显示树状图
-n    用程序识别码排序。预设是以程序名称来排序
-p    显示进程 id
-u    显示进程所属用户
-U    使用 UTF-8 列绘图字符
-V    显示版本信息

4.6 lsof命令——列举被打开的文件

list opened files 就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件

命令格式: lsof [options]

常用选项:

选项功能
-c 字符串只列出以字符串开头的进程打开的文件。

+d 目录名

列出某个目录中所有被进程调用的文件。
-u 用户名只列出某个用户的进程打开的文件
-p pid列出某个 PID 进程打开的文件。

实例:

[root@localhost ~]# lsof                       //查询系统中所有进程调用的文件
 ​ [root@localhost ~]# lsof +d /dev              //显示/dev目录下所有被打开的文件及对应进程
 ​ [root@localhost ~]# lsof -u nancy           //查询nancy用户打开的所有文件
 ​ [root@localhost ~]# lsof -p 655             //查询655进程打开的所有文件

4.7 vmstat命令——监控系统资源

     如果想动态地了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。

     vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息

vmstat [-a] [刷新延时 刷新次数]    #-a:显示活跃和非活跃内存

 查询出的信息共分6段,下面是具体说明

字段含义
procs进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。
swap交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
io磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。
system系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。
cpuCPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比

4.7.2 vmstat命令格式二

 vmstat [选项]...

选项含义
-f显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。
-s将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。
-S 单位令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d列出硬盘有关读写总量的统计表。
-p 分区设备文件名查看硬盘分区的读写情况。

5 启动进程

5.1 手工启动

  • 前台启动:用户输入命令,直接执行程序。
  • 后台启动:在命令行尾加入“&”符号。

5.2 调度启动

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

6 进程的前后台调度(作业控制)

 &                 //在命令行尾加入“&”符号,把命令放到后台执行。
 
 Ctrl+Z 组合键     //将当前进程挂起,即调入后台并停止执行。
 
 jobs             //查看处于后台的任务列表。
 
 fg 任务序号       //将后台进程恢复到前台运行,可指定任务序号。
 
 bg 任务序号       //将一个在后台暂停的任务,变成继续执行。

 

7 结束进程

7.1 kill命令

原理:kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。

kill [信号] PID  ​  

#kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名

信号编号信号名含义
0EXIT程序退出时收到该信息。
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2INT表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3QUIT退出。键盘退出使用 "Ctrl+\ "。
9KILL杀死进程,即强制结束进程。
19STOP暂停。

7.2 killall命令

 killall [选项] [信号] 进程名

killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用

常用选项:

  • -i:交互式,询问是否要杀死某个进程。
  • -I:忽略进程名的大小写。

7.3 pkill命令

pkill [信号] 进程名

pkill [-U 用户名] 进程名
 pkill [-t 终端号] 进程名
 ​
 -U:根据进程所属的用户名终止相应进程
 -t:根据进程所在的终端终止相应进程

8 计划任务管理

8.1 at一次性任务设置

at 工具介绍:

  1. 由包 at 提供
  2. 依赖与atd服务,需要启动才能实现at任务
  3. at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
  4. 执行任务时PATH变量的值和当前定义任务的用户身份一致

at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:

如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)。
如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。

系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需把用户写入 /etc/at.deny 文件即可。

设置任务

 at [选项]  [时间]
 at [HH:MM]  [yyyy-mm-dd]
 ​
 #设置具体任务后,按 ctrl+d 提交 。
 #若设置具体任务时,想要退格重写,按ctrl+backspace进行退格。

查询和删除at任务:

 atq      //查看at任务列表
 ​ atrm [工作号]  //删除指定的at任务

格式用法
HH:MM比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行
Midnight(midnight)代表 12:00 AM(也就是 00:00)
Noon(noon)代表 12:00 PM(相当于 12:00)
Teatime(teatime代表 4:00 PM(相当于 16:00
英文月名 日期 年份比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无
MMDDYY、MM/DD/YY、MM.DD.YY比如 011518 表示 2018 年 1 月 15 号。
now+时间以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。

实例: 

 

8.2 crontab周期性任务设置

8.2.1 crontab命令简介

  • 按照预先设置的时间周期(分钟、小时、天......)重复执行用户指定的命令操作。
  • 属于周期性计划任务。
  • 主要设置文件。
    • 全局配置文件,位于文件:/etc/crontab
    • 系统默认的设置,位于目录:/etc/cron.*/
    • 用户定义的设置,位于文件:/var/spool/cron/用户名

8.2.2 管理crontab计划任务

crontab命令格式:

crontab -e [-u 用户名]      //编辑计划任务
 ​
 crontab -l [-u 用户名]      //查看计划任务
 ​
 crontab -r [-u 用户名]      //删除计划任务

 每个星号(*)表示不同的时间概念:

项目含义范围
第一个"*"一小时当中的第几分钟(minute)0~59
第二个"*"一天当中的第几小时(hour)0~23
第三个"*"

一个月当中的第几天(day)

1~31
第四个"*"一年当中的第几个月(month)1~12
第五个"*"一周当中的星期几(week)0~7(0和7都代表星期日

时间数值的特殊表示方法:

特殊符号含义
*(星号)代表任何时间。比如第一个"*"就代表一小时中每分钟都执行一次的意思。
,(逗号)代表多个不连续的时间点。比如 "0 8,12,16 * * * 命令" 就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠)代表连续的时间范围。比如"0 5 * * 1-6 命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线)代表每隔多久执行一次(即间隔的时间频率)。比如"*/10命令",代表每隔 10 分钟就执行一次命令。

实例:

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命令。 ]

crontab -l -u  展示当前设定的定时任务
crontab -r -u 删除所有定时任务 ---使用的时候慎重
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值