进程和计划任务

76 阅读13分钟

一.进程

1.什么是程序?

  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
  • 用于描述进程要完成的功能,是控制进程执行的指令集

2.什么是进程?

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

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

进程创建:

  • init:第一个进程,从 CentOS7 以后为systemd
  • 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write 写实更新,有数据写入子进程需要新的内存空间

进程具有的特征:

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

3.什么是僵尸进程?

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

4.什么是线程?

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

二.查看进程

ps 命令是 Process Status 的缩写 ,可以查看进程当前状态的快照。查看静态的进程统计信息,即执行 ps 命令的那个时刻的进程快照。默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID 目录下的各文件中。

ps命令支持三种语法格式:

  • UNIX风格。选项可以组合在一起,并且选项前必须有 "-" 连字符 。如:ps -ef。
  • GNU选项。选项前有两个 "-" 连字符 。如:ps --help。
  • BSD选项。选项可以组合在一起,但是选项前不能有 "-" 连字符。如:ps aux。

查看静态的进程统计信息

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

常用选项

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

举例说明:

1.ps aux 查看进程信息

微信截图_20230729105554.png

进程信息共有11个字段,每个字段含义如下:

微信截图_20230729105946.png

2.ps -le

微信截图_20230729110056.png

进程信息共有14个字段,每段含义如下:

微信截图_20230729110149.png

只查看当前登录进程信息:ps-l

微信截图_20230729110306.png

2.top命令

ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。

为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

选项:

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

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

微信截图_20230729110529.png

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

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

微信截图_20230729110829.png

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

微信截图_20230729111648.png

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

微信截图_20230729111658.png

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

微信截图_20230729111710.png

第四行为物理内存信息,具体内容如表buff cache:

微信截图_20230729111726.png

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

微信截图_20230729112000.png

注:htop(增强版本的top命令)

3. pgrep命令

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

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

pidof 已知程序名不知道pid号,可以用pidof命令查看

微信截图_20230729112922.png

4.psteer命令

以树形结构列出进程信息

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

微信截图_20230729112554.png

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

微信截图_20230729113058.png

微信截图_20230729113321.png

5.监控系统资源 虚拟 资源 vmstat

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

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

微信截图_20230729113431.png

微信截图_20230729113630.png

微信截图_20230729113710.png

通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:

  • r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
  • b 表示不可中断睡眠的进程
  • swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
  • cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
  • 一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
  • 如果 bi+bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
  • 输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us+sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。

总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。

6.内存

free命令查看,或top命令

微信截图_20230729114111.png

7.iostat

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

此工具由sysstat包提供

微信截图_20230729114241.png

微信截图_20230729114318.png

8.uptime 系统运行了多久时间

微信截图_20230729114528.png

9.显示CPU相关统计mpstat

微信截图_20230729114624.png

三.进程管理

1.手动启动进程

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

命令 &",把命令放入后台执行

让作业运行于后台

  • 运行中的作业: Ctrl+z 放到后台 但是会停止作业
  • 尚未启动的作业: COMMAND &

第一种把命令放入后台的方法是在命令后面加入 空格 &

使用这种方法放入后台的命令,在后台处于执行状态。

注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的。

使用sleep命令来观察前台启动与后台启动的区别。

  • "sleep 500"让系统睡眠500秒,在前台运行。

那么进程会占用终端,在进程结束前无法执行其他命令。必须等待进程结束。

微信截图_20230729115021.png

微信截图_20230729115230.png

使用ps aux命令可以查到此进程

2.调度启动

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

3.命令使用集合。

3.1jobs命令

查看后台任务列表

微信截图_20230729120033.png

3.2fg命令

将后台进程恢复到前台运行,可指定任务序号

微信截图_20230729120140.png

3.3bg命令

重新开始任务

3.4Ctrl+C组合键

中断正在执行的命令

微信截图_20230729120830.png

3.5结束进程

kill 、killall命令

kill用于终止指定PID号的进程

-9选项用于强制终止

微信截图_20230729121239.png

3.6kill与killall区别

kill命令,它是通过pid(进程ID)来杀死进程,要得到某个进程的pid,我们可以使用ps(process status)命令,默认情况下,kill命令发送给进程的终止信号是15,但是有些进程不会理这个信号,这样的话,可以用9信号来强制杀死,信号9是不会被忽略的强制性执行信号。

而killall和pkill都是使用命令名来终止进程的有效手段,它们不同于kill通过pid来杀死进程的方式,它可以理解为成批成批的杀死进程,当然这么做的危险性也相对提高了不少。当然它们也可以给进程发送相应的终止信号。

四.计划任务管理

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 文件即可

2.crontab周期任务设置

  • 按照预先设置的时间周期(分钟、小时、天......)重复执行用户指定的命令操作。

  • 属于周期性计划任务。

  • 主要设置文件。

    • 全局配置文件,位于文件:/etc/crontab

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

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

常用选项:

-u :缺省时默认是针对当前用户,只有超级用户才可以用-u

-e:编辑计划任务

-l:查看计划任务

-r:删除计划任务

-i:交互删除计划任务

微信截图_20230729121903.png

在时间表示中,还有一些特殊符号需要学习

微信截图_20230729121951.png

举例:

微信截图_20230729122744.png

微信截图_20230729122532.png

微信截图_20230729122601.png

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

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
  • crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。

总结:

1.查看进程相关命令

静态查看:ps aux,ps -elf

动态查看:top

查看指定进程:prtstat

以树形结构列出:pstree

列举被打开的文件:lsof

监控系统资源:vmstat、iostat

发现僵尸进程(状态为Z)一定要杀掉。

2.控制进程相关

  • 后台启动:

命令行尾加”&“符号。

  • 前后台调度:

ctrl+z 挂起当前进程,

jobs查看任务列表

fg 序号,将前台进程调到后台运行。

bg 序号,将后台暂停的进程恢复执行状态。

  • 修改优先级:

nice,启动程序时设置优先级。

renice,修改现有进程的优先级。

  • 杀死进程:

kill [信号] PID

killall 进程名

pkill [信号] [-U 用户名]

pkill [信号] [-t 终端名]

3.计划任务管理

at一次性任务设置

at [HH:MM] [yyyy-mm-dd]:设置一次性任务,按ctrl+d 提交任务。

atq :查看at任务。

atrm:删除at任务。

  • crontab周期性任务设置

crontab -e:编辑计划任务。

crontab -l:查看计划任务。

时间格式:分、时、日、月、周几。 可以查看cat /etc/crontab 文件。

*表示任意。

,表示多个不连续的时间点。

-表示连续的时间范围。

/表示频率。

命令要使用绝对路径。

6个选项(时间+任务)都不能为空,必须填写。