linux系统之【进程和计划任务】

233 阅读21分钟

1、进程

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

进程是运行在cpu上的,进程分为父进程和子进程,子进程皆由父进程产生,总的父进程是systemd。

1.1 关系

程序和进程是兄弟关系;内存与程序、进程是父子关系。

内存 > 程序 > 进程

程序是资源的最小分配单位。一个程序里,必须要有一个线程。

根下存放进程的文件夹:proc 也就是process

一个进程由一个或多个线程组成。线程主要是干活的。

1.2 查看线程的命令:

 prtstat命令:
     prtstat 743 #查看743 单个进程的状态
     Threads:1    #1个线程
     sleeping     #休眠状态
     grep -i threads /proc/743/status   #-i忽略大小写

1.3 为什么要管理进程?

  • 因为开启进程 要消耗硬件资源
  • 如果硬件资源消耗完了,轻则卡顿、重则死机。

1.4 什么情况下内存会被使用完?

  • 中病毒
  • 程序异常
  • 程序设计不合理

1.5 进程使用内存的问题

  • 内存泄漏
  • 内存溢出
  • 内存不足

1.6 进程状态

image.png

1.6.1 基本状态

  • 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

  • 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行,排队等待

  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态

  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

    • 阻塞
    • 非阻塞
  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

1.6.2 常见的四种进程状态分别是:

  • 就绪状态
  • 执行状态
  • 阻塞状态
  • 终止状态

1.6.3 更多的进程状态:

  • 运行态:running
  • 就绪态:ready
  • 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
  • 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程

1.7 进程之间如何通信?

  • 单机之间通讯,是通过管道进行(pipe管道);
  • 不同主机之间,是通过套接字socket 进行程序的通信。
  • lock 对资源上锁 程序之间加锁。为什么要加锁?因为同时处理会造成数据的混乱。

1.8 程序的优先级分为两部分:

  • 系统优先级 PR
  • 程序优先级 NI (nice) , NI的优先级范围是:-20到19

// 优先级是两个加起来,值越小优先级越高。比如,0比20的优先级高。

1.9 进程分类

  • 守护进程:daemon,
  • 前台进程:跟终端相关,通过终端启动的进程。比如ping ,会影响当前的操作。

1.10 五大性能对应的命令

性能命令
内存使用率free 、 top
cpu使用率ps 、 top 、 w 、 iostat
磁盘使用df
磁盘读写性能iostat 、 dd
网络带宽iftop

2、查看进程相关命令

2.1 ps

process 进程,查看静态的进程统计信息。

 ps aux |grep zhangsan    #过滤zhangsan用户打开的进程

2.1.1 ps命令支持三种选项:

  • UNIX选项 如: -A -e
  • GNU选项 如: - - help
  • BSD选项 如: a

// 注意:ps 加- 和不加-,含义差异比较大,使用时一定要注意区分!

查看静态的进程统计信息

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

2.1.2 常用选项

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

// 重点是a u x 三种选项。

2.1.3 对应字段

ps aux 可以查看系统中所有的进程,查看优先级等,注意不要加 -

运行ps aux命令,会出现的字段:

字段名称功能描述
user用户 可以看到什么用户,比如zhangsan运行了该程序
pidpid号
%cpucpu使用率
%MEM内存使用率
VSZ虚拟内存
RSS真实内存
TTY终端设备
STAT进程状态
START进程开启时间
TIME进程占用cpu的时间
COMMAND运行过的命令,类似history

// 注意:cpu和mem前面加了%

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

2.1.4 范例:僵尸进程

父进程只有一个。父进程的pid号是小号,子进程的pid号是大号。

 [root@centos8 ~]#bash
 ​
 #创建子进程1809
 [root@centos8 ~]#echo $BASHPID
 1809
 ​
 #父进程1436
 [root@centos8 ~]#echo $PPID
 1436
 ​
 #将父进程设为停止态,停止后就无法接收数据。
 [root@centos8 ~]#kill -19 1436   
 ​
 #杀死子进程,使其进入僵尸态
 [root@centos8 ~]#kill -9 1809
 ​
 [root@centos8 ~]#ps aux #可以看到上面图示的结果,STAT为Z,表示为僵尸态
 ​
 #方法1:恢复父进程
 [root@centos8 ~]#kill -18 1436 
 ​
 #方法2:杀死父进程
 [root@centos8 ~]#kill -9 1436
 ​
 #再次观察,可以僵尸态的进程不存在了
 [root@centos8 ~]#ps aux

// 总结: 1、先停止父进程;2、再杀死子进程;3、查看僵尸状态;4、最后恢复父进程或者直接杀死父进程。

面试题:如何过滤僵尸进程?

ps aux |grep -v grep |grep Z

2.1.5 ps下的aux与axo

小科普:cpu的利用率 可以超过100% ,如果有4块cpu的话,cpu利用率最高可达400%

aux:

 lscpu   #查看cpu
 ​
 #选项k是对属性进行排序,默认是正序;前面加- ,是倒序。
 ps aux k %cpu   #按cpu排序 ,不加- 是正序
 ps aux k -%cpu   按cpu排序 ,加- 是倒序
 ​
 #加head或者tail,只显示前十个或者后十个。
 ps aux k %cpu |head
 ps aux k %cpu |tail
 ​
 #根据内存,按倒序排列:
 ps aux k -%mem
 ​
 ps -elf  #与ps aux差不多,只是显示的风格不同。

axo:

 #筛选特定属性:axo
 ps axo pid  #只查看pid字段
 ​
 #筛选多个属性字段,中间用,隔开
 ps axo user,pid  #查看user和pid两个字段
 ​
 ps axo pid,ppid  #筛选子进程和父进程,ppid是父进程
 ​
 ps axo pid,cmd,%cpu,%mem --sort %mem   #意思是 筛选pid、cmd、%cpu、%mem四个字段,并以%mem进行排序。

2.1.6 查看进程信息prtstat

 prtstat 18395   #prtstat+pid号

小拓展:程序中毒了,如何处理?

  • 首先用ps 、top等命令查看系统运行状态
  • 找到异常程序
  • 排查是否可以结束该程序的进程
  • 如果可以结束,则通过pid号,找到文件具体位置,将其删除;同时删除后,建立与病毒同名的文件夹。(建立同名文件夹的原因是:同一个文件夹下面的文件名不能重复)并且可以添加特殊权限,使得病毒无法再次攻击。
 chattr +i 文件名   #添加权限
 chattr -i 文件名   #删除权限
 lsattr 文件名      #查看权限
  • 最坏的方法 是重装系统。

2.2 top

top 可以动态地持续监听进程地运行状态。

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

  1. 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
  2. 第二部分从第六行开始,显示的是系统中进程的信息;

2.2.1 第一部分

第一行为任务队列信息,具体内容如表 所示。

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

第二行为进程信息,具体内容如表

内 容说 明
Tasks: 95 total系统中的进程总数
1 running正在运行的进程数
94 sleeping睡眠的进程数
0 stopped正在停止的进程数
0 zombie僵尸进程数。如果不是 0,则需要手工检查僵尸进程

第三行为 CPU 信息,具体内容如表:

内 容说 明
Cpu(s): 0.1 %ususer 用户模式占用的 CPU 百分比 个人用户开启的进程占用的 cpu 率
0.1%sysystem 系统模式占用的 CPU 百分比
0.0%ni改变过优先级的用户进程占用的 CPU 百分比
99.7%id空闲 CPU 占用的 CPU 百分比
0.1%wawait 等待输入/输出的进程占用的 CPU 百分比 1
0.0%hi硬中断请求服务占用的 CPU 百分比
0.1%si软中断请求服务占用的 CPU 百分比
0.0%stst(steal time)意为虚拟程序占用 cpu 时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 偷取时间

// 内核态 、用户态:内核态包含用户态,用户态是内核态里的一部分空间。内核处于内存里面。内核态和用户态都属于内存空间。内核态权限高、用户态权限低。

2.2.2 第二部分

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

  • PID:进程的 ID。
  • USER:该进程所属的用户。
  • PR:优先级,数值越小优先级越高。
  • NI:优先级,数值越小、优先级越高。
  • VIRT:该进程使用的虚拟内存的大小,单位为 KB。
  • RES:该进程使用的物理内存的大小,单位为 KB。
  • SHR:共享内存大小,单位为 KB。
  • S:进程状态。
  • %CPU:该进程占用 CPU 的百分比。
  • %MEM:该进程占用内存的百分比。
  • TIME+:该进程共占用的 CPU 时间。
  • COMMAND:进程的命令名。

2.2.3 选项或命令

选项:

选项功能描述
-d指定刷新时间,默认为3秒
-b全部显示所有进程
-n刷新多少次后退出

命令:

命令功能描述
q退出
top -n 2连刷2次 自动退出
ccpu排序

2.3 pgrep

过滤进程,基本等于ps aux命令

查看指定的进程:

选项功能描述
-u指定用户
-l显示进程名
-a显示完整格式的进程名
-P pid显示指定进程的子进程
 pgrep -u zhangsan | wc -l
 # 统计zhangsan用户共运行多少个进程
 ​
 pgrep -lu zhangsan   #指定显示进程的名字

2.4 pstree

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

选项备注说明
-aall 显示完整信息
-uuser 列出对应用户名
-ppid 列出对应PID号
-T不显示线程thread ,默认显示线程
-H高亮显示pid号(加粗)

// 常用的就是 pstree -p

2.5 lsof

lsof命令 是list opened files的缩写, 也就是列举进程打开的文件。

选项功能
-c 字符串只列出以字符串开头的进程打开的文件
+d 目录名列出某个目录中所有被进程调用的文件
-u 用户名只列出某个用户的进程打开的文件
-p pid列出某个 PID 进程打开的文件
-i指定端口号
 lsof -i :80    #列举哪些进程打开了80端口
 ​
 lsof |grep deleted
 删除大文件,为什么不释放空间?
 因为有用户正在使用该文件。注意:删除文件时,不要使用rm -rf。
 ​
 dd  if=/dev/zero  of=/dev/bigfile
 ​
 echo“ ” > 大文件,意思是把大文件中的内容变成一个空格。
 ​
 echo“ ” > > 大文件,两个>代表追加,也就是再追加一个空格。
 //   按照上述操作,相当于变相删除了大文件。

面试题: 删除的文件可以找回吗?

  • linux中删除文件,如果文件正在被别的用户使用,可以找回。找回命令 lsof |grep deleted
  • 如果没有用户在使用,则文件无法找回。

演示:

 新建文件 绝对路径为/data/test.txt
 tail -f test.txt   #用户1打开test.txt文件
 rm -rf /data/test.txt    #用户2删掉该文件
 lsof |grep test.txt   #使用lsof命令过滤出删除的文件,并且可以看到pid号
 cd /proc/pid号    
 cd fd    #切换到fd,fd是描述符。
 cat [文件夹名] > /data/test.txt
 通过上述方法,就可以恢复被删除的文件。

2.6 vmstat

Virtual Meomory Statistics (虚拟内存统计) 的缩写,用来监控系统资源。

 [root@localhost ~]# vmstat [-a] [刷新延时 刷新次数]
 [root@localhost ~]# vmstat [选项] 
 ​
 ​
 [root@localhost proc]# vmstat 1 3
 #使用vmstat检测,每隔1秒刷新一次,共刷新3次
 ​
选项含义
-fs-f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-S 单位令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 单位只能是K、M、k、m
-d列出硬盘有关读写总量的统计表。
-p 分区设备文件名查看硬盘分区的读写情况。
字段含义
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 百分比
 vmstat -d
 iostat   #可以查看磁盘的读写效率

2.7 free

选项功能
-h
-m以m为单位查看

pmap +pid号 :查看进程占用内存的详细信息

2.8 iostat

iostat 可以提供更丰富的IO性能状态数据

此工具由sysstat包提供。

选项功能描述
-c只显示CPU行
-d显示设备〈磁盘)使用状态
-k以千字节为为单位显示输出
-t在输出中包括时间戳
-x在输出中包括扩展的磁盘指标
 iostat 1 -d /dev/sda
 #每1秒刷新一次,只刷新sda

2.9 iotop

监视磁盘

只能在网络环境下使用。

小拓展:iftop 监控网络流量,同样也需要安装。界面很炫酷。

yum install iftop -y

2.10 uptime

系统运行了多长时间

 [root@localhost ~]#uptime 
  01:29:00 up  2:07,  6 users,  load average: 0.00, 0.01, 0.05
 当前时间      运行时间  登录用户        cpu负载情况

2.11 mpstat

显示CPU相关统计

这些命令都是非常规命令,用的都比较少。

2.12 dstat

系统资源统计。

因为这类不是基础命令,所以光驱里面是没有的,要从网络源里下载。

小拓展:如果安装一直解析不了,可以考虑更换DNS

 vim /etc/sysconfig/network-scripts/ifcfg-ens33
 ​
 DNS1:218.2.135.1   #南京电信DNS地址
 DNS2:8.8.8.8  #谷歌地址
 ​
 systemctl restart network  #重新启动network
 ​
 cat /etc/resolv.conf    #查看是否解析成功,地址一致就是解析成功了。

2.13 webmin

开源软件

 yum install webmin-2.100-1.noarch.rpm -y    #安装webmin
 systemctl start webmin   #开启webmin
 ​
 ss -natp |grep 10000
 #过滤出 端口号为10000
 ​
 192.168.91.10010000  #在浏览器中打开

3、缓存与缓冲

3.1 缓存cache

echo3 代表清缓存,清除是一次性的。

 echo 3 > /proc/sys/vm/drop_caches
 #3 代表清缓存;默认值是0

3.2 缓冲buffer

free -h命令 可以看到buffer和cache

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

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

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

4、进程的启动方式

4.1 手动启动

前台执行 和 后台执行:

命令功能描述
命令 &将前台命令放入后台执行
命令 ctrl+z将运行中的前台命令 放入后台 挂起
jobs可以查看后台执行的命令, 会显示序号
bg 序号继续运行后台的命令
fg 序号将后台程序调回前台执行
kill结束进程,只能用这个。

小拓展:

1、为什么要将前台命令放到后台?

因为后台执行时 可以并行,在前台只能串行,后台的执行效率非常强大。

4.2 结束进程

4.2.1 kill

 kill -9 PID号   #kill发信号-9,让pid号对应的程序强制关闭。不能直接写程序名,因为程序名有时不是唯一的。
 kill -1   #重新加载
 kill -3   #退出

kill 共64个信号,下面是64个信号中,比较重要的信号:

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

// 信号有两种写法:

  • -信号编号
  • 信号名

常用的信号名:(需记住)

 HUP
 QUIT
 WINCH
 USR1   #重新生成日志
 USR2
 kill pid号
 ​
 kill -3 pid号 等于 kill QUIT pid号

4.2.2 killall

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

 命令语法:
     killall [选项] [信号] 进程名 
     
     killall nginx   #也就是关闭任何带有nginx名字的程序。
     
     killall -i sshd   #交互杀死sshd
选项功能
-i交互式,询问是否要杀死某个进程;
-l忽路进程名的大小写;

4.2.3 pkill

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,该命令的基本格式如下:

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

// killall 和 pkill 用的比较少

5、计划任务

5.1 at一次性

 atq     可以查看未执行的任务
 atrm+序号  删除
 ctrl + D    提交任务
 at now+1min   #从现在开始,往后加1分钟

5.2 crontab周期性

crontab软件是默认安装的。

 命令语法:
     crontab [选项] [file]
     
 cat /etc/crontab   #查看配置文件
选项功能描述
-e编辑
-l查看
-r清空、删除

// 执行命令的时候 注意权限问题。

分时日月周:

最小的有效时间是 分钟,不识别 秒。

image.png

 *   *   *  *   *   #后面加执行命令的绝对路径
 分  时  日  月  周   #0和7都是指星期天
项目含义范围
第一个"*"一小时当中的第几分钟(minute)0~59
第二个"*"一天当中的第几小时(hour),注意是24小时计时法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 分钟就执行一次命令。

image.png

 0  1  *  *  1-7   #周一到周日 凌晨一点  ,为什么第一个用0?如果第一个用*  代表凌晨一点的每一分钟都在执行。
 第一位:*/2  代表每2分钟

crontab -e 开始编辑 , 注意,里面不能出现特殊符号,比如不识别 %

在书写 crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。

  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。

  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。

    • 比如下面例子,既要每月的20号 又要满足是星期一,这种效果不太能实现,所以要避免类似的设置。
 *  *  20  *  1    
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。