进程和计划任务

136 阅读17分钟

程序

什么是程序

  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
  • 用于描述进程要完成的功能,是控制进程执行的指令集
  • 保存在硬盘、光盘等介质中的可执行代码和数据
  • 静态保存的代码

进程

什么是进程

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

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

进程创建:

  • init:第一个进程,从 CentOS7 以后为systemd
  • 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write

进程具有的特征

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

僵尸进程

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

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init 来接管他,成为他的父进程。

查看进程

ps(静态查看进程)

ps 即 process state,可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的各文件中。

常用选项

选项作用
-a显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
-u使用以用户为主的格式输出进程信息。
-x显示当前用户在所有终端下的进程信息
-e显示系统内的所有进程信息
-l使用长(Long)格式显示进程信息。
-f使用完整的(Full)格式显示进程信
  • "ps aux" 可以查看系统中所有的进程;
  • "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
  • "ps -l" 只能看到当前 Shell 产生的进程。

ps aux

查看进程信息

[root@localhost ~]# ps aux |head -10
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
//11个字段
root          1  1.5  0.3 128164  6824 ?        Ss   03:23   0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    03:23   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    03:23   0:00 [ksoftirqd/0]
root          4  0.0  0.0      0     0 ?        S    03:23   0:00 [kworker/0:0]
root          5  0.0  0.0      0     0 ?        S<   03:23   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    03:23   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    03:23   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    03:23   0:00 [rcu_bh]
root          9  0.1  0.0      0     0 ?        S    03:23   0:00 [rcu_sched]

进程信息11个字段的含义如下:

表头含义
USER该进程是由哪个用户产生的。
PID进程的 ID。
%CPU该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
%MEM该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。
VSZ该进程占用虚拟内存的大小,单位为 KB。
RSS该进程占用实际物理内存的大小,单位为 KB。
TTY该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。
STAT进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 -+:位于后台。
START该进程的启动时间。
TIME该进程占用 CPU 的运算时间,注意不是系统时间。
COMMAND产生此进程的命令名。

ps -le

查看进程信息

[root@localhost ~]# ps -le|head -10
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
//14个字段信息
4 S     0      1      0  0  80   0 - 32041 ep_pol ?        00:00:00 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0  80   0 -     0 smpboo ?        00:00:00 ksoftirqd/0
1 S     0      4      2  0  80   0 -     0 worker ?        00:00:00 kworker/0:0
1 S     0      5      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0      6      2  0  80   0 -     0 worker ?        00:00:00 kworker/u256:0
1 S     0      7      2  0 -40   - -     0 smpboo ?        00:00:00 migration/0
1 S     0      8      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh
1 S     0      9      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_sched

进程信息14个字段的含义如下:

表头含义
F进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限;
S进程状态。具体的状态和"psaux"命令中的 STAT 状态一致;
UID运行此进程的用户的 ID;
PID进程的 ID;
PPID父进程的 ID;
C该进程的 CPU 使用率,单位是百分比;
PRI进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改
NI进程的优先级,数值越小,该进程越早被执行;可以人为修改
ADDR该进程在内存的哪个位置;
SZ该进程占用多大内存;
WCHAN该进程是否运行。"-"代表正在运行;
TTY该进程由哪个终端产生;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
CMD产生此进程的命令名;

如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 "ps -l" 命令就足够了

查看特定属性

[root@localhost ~]# ps axo pid,cmd,%mem,%cpu|head -10
#查看进程的特定属性
   PID CMD                         %MEM %CPU
     1 /usr/lib/systemd/systemd --  0.3  0.1
     2 [kthreadd]                   0.0  0.0
     3 [ksoftirqd/0]                0.0  0.0
     5 [kworker/0:0H]               0.0  0.0
     7 [migration/0]                0.0  0.0
     8 [rcu_bh]                     0.0  0.0
     9 [rcu_sched]                  0.0  0.0
    10 [watchdog/0]                 0.0  0.0
    11 [watchdog/1]                 0.0  0.0
[root@localhost ~]# ps -eo user,pid,ppid,%cpu,command |head -5
#查看进程的USER、PID、PPID、%CPU、COMMAND五个属性
USER        PID   PPID %CPU COMMAND
root          1      0  0.1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0.0 [kthreadd]
root          3      2  0.0 [ksoftirqd/0]
root          5      2  0.0 [kworker/0:0H]

进程排序

[root@localhost ~]# ps aux --sort=%cpu |head -5
#按CPU占比升序排列
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          2  0.0  0.0      0     0 ?        S    03:23   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    03:23   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   03:23   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    03:23   0:00 [migration/0]

top(动态查看进程)

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

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

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

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

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

举例:

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

top命令输出内容

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。

命令的输出主要分为两部分:

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

top - 03:41:38 up 18 min,  1 user,  load average: 0.00, 0.01, 0.01
Tasks: 150 total,   1 running, 149 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2031912 total,  1379352 free,   294780 used,   357780 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1534148 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                    
     1 root      20   0  128164   6824   4060 S   0.0  0.3   0:00.84 systemd                                    
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                   
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.00 ksoftirqd/0                                
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                               
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.02 migration/0                                
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                     
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.07 rcu_sched                                  
    10 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 watchdog/0                                 
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 watchdog/1                                 
    12 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 migration/1                                
    13 root      20   0       0      0      0 S   0.0  0.0   0:00.01 ksoftirqd/1                                
    14 root      20   0       0      0      0 S   0.0  0.0   0:00.06 kworker/1:0                                
    15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H                               
    17 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kdevtmpfs                                  
    18 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 netns                                      
    19 root      20   0       0      0      0 S   0.0  0.0   0:00.00 khungtaskd                                 
    20 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 writeback          

第一部分

第一部分是前五行,显示的是整个系统的资源使用状况。

top - 03:41:38 up 18 min,  1 user,  load average: 0.00, 0.01, 0.01
Tasks: 150 total,   1 running, 149 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2031912 total,  1379352 free,   294780 used,   357780 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1534148 avail Mem 

1.第一行是任务队列信息,具体内容如下表所示。  top - 03:41:38 up 18 min, 1 user, load average: 0.00, 0.01, 0.01

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

2.第二行是进程信息,具体内容如下表。 Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie

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

3.第三行是 CPU 信息,具体内容如下表。 %Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

内容说明
%Cpu(s): 0.0 us用户模式占用的 CPU 百分比
0.2 sy系统模式占用的 CPU 百分比
0.0 ni改变过优先级的用户进程占用的 CPU 百分比
99.8 id空闲 CPU 占用的 CPU 百分比
0.0 wa等待输入/输出的进程占用的 CPU 百分比
0.0 hi硬中断请求服务占用的 CPU 百分比
0.0 si软中断请求服务占用的 CPU 百分比
0.0 stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

4.第四行是物理内存信息,具体内容如下表。 KiB Mem : 2031912 total, 1379352 free, 294780 used, 357780 buff/cache

内容说明
KiB Mem : 2031912 total物理内存的总量,单位为KB
1379352 free空闲的物理内存数量
294780 used已使用的物理内存数量
357780 buff/cache作为缓冲的内存数量

5.第五行是交换分区(swap)信息,具体内容如下表。 KiB Swap: 4194300 total, 4194300 free, 0 used. 1534148 avail Mem

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

根据第一部分判断服务器健康状况:

通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。

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

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

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

第二部分

image.png

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

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

pgrep(查询进程PID)

选项作用
-U指定用户
-l显示进程名
-a显示完整格式的进程名
-P < PID>显示指定进程的子进程
[root@localhost ~]# pgrep -l "log"
# 显示进程名
421 xfs-log/dm-0
660 xfs-log/sda1
668 xfs-log/sdb1
734 rsyslogd
738 systemd-logind
742 abrt-watch-log
744 abrt-watch-log

prtstat命令(查看指定的进程)

-r :格式显示

[root@localhost ~]#  prtstat -r 1121
Process with pid 1121 does not exist.
[root@localhost ~]#  prtstat -r 660
         pid: 660            	                  comm: xfs-log/sda1
       state: S              	                  ppid: 2
        pgrp: 0              	               session: 0
      tty_nr: 0              	                 tpgid: -1
       flags: 420a060        	                minflt: 0
     cminflt: 0              	                majflt: 0
     cmajflt: 0              	                 utime: 0
       stime: 0              	                cutime: 0
      cstime: 0              	              priority: 0
        nice: -20            	           num_threads: 1
 itrealvalue: 0              	             starttime: 223
       vsize: 0              	                   rss: 0
      rsslim: 18446744073709551615	             startcode: 0
     endcode: 0              	            startstack: 0
     kstkesp: 0              	               kstkeip: 0
       wchan: 18446744071579536894	                 nswap: 0
      cnswap: 18446744071579536894	           exit_signal: 17
   processor: 0              	           rt_priority: 0
      policy: 0              	 delayaccr_blkio_ticks: 0
  guest_time: 0              	           cguest_time: 0

pstree命令(树形结构列出进程信息)

选项作用
-a显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
-p显示PID
-p < pid>显示指定进程及其子进程,同时显示每个进程的PID
-u显示进程的用户名称
-u 用户名显示指定用户的进程。
-H < pid>高亮显示指定进程及其前辈进程
-T不显示线程thread,默认显示线程
[root@localhost ~]# pstree 660
xfs-log/sda1

lsof命令(列举被打开的文件)

选项作用
-c 字符串只列出以字符串开头的进程打开的文件。
+d 目录名列出某个目录中所有被进程调用的文件。
-u 用户名只列出某个用户的进程打开的文件。
-p pid列出某个 PID 进程打开的文件。
[root@localhost ~]# lsof | more
#查询系统中所有进程调用的文件
COMMAND    PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                root  cwd       DIR              253,0       236         64 /
systemd      1                root  rtd       DIR              253,0       236         64 /
systemd      1                root  txt       REG              253,0   1523568   33924706 /usr/lib/systemd/system
d
systemd      1                root  mem       REG              253,0     20040     265152 /usr/lib64/libuuid.so.1
.3.0
systemd      1                root  mem       REG              253,0    261336     562399 /usr/lib64/libblkid.so.
1.1.0
systemd      1                root  mem       REG              253,0     90664     265137 /usr/lib64/libz.so.1.2.
7
systemd      1                root  mem       REG              253,0    157424     265233 /usr/lib64/liblzma.so.5
.2.2
systemd      1                root  mem       REG              253,0     23968     265314 /usr/lib64/libcap-ng.so
.0.0.0
systemd      1                root  mem       REG              253,0     19888     265622 /usr/lib64/libattr.so.1
.1.0
systemd      1                root  mem       REG              253,0     19776     215859 /usr/lib64/libdl-2.17.s
o
systemd      1                root  mem       REG              253,0    402384     265124 /usr/lib64/libpcre.so.1
.2.0

vmstat命令(监控系统资源)

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

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

选项作用
-fs-f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-S 单位令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d列出硬盘有关读写总量的统计表。
-p 分区设备文件名查看硬盘分区的读写情况。
[root@localhost ~]# vmstat 1 3
#使用vmstat检测,每隔1秒刷新一次,共刷新3次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 1371048   2224 363676    0    0    55     2   34   37  0  0 100  0  0
 0  0      0 1371048   2224 363708    0    0     0     0   57   51  0  0 100  0  0
 0  0      0 1371048   2224 363708    0    0     0     0   44   38  0  0 100  0  0
字段含义
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 百分比

启动进程

手动启动

  • 前台启动:通过终端启动,且启动后一直占据终端
  • 后台启动:可通过终端启动,但启动后即转入后台运行(释放终端)

&(后台执行)

让作业运行于后台

  • 运行中的作业: Ctrl+z
  • 尚未启动的作业: COMMAND &
[root@localhost ~]# cp -r /data/* /opt/ &
[1] 2224

jobs(查看后台任务列表)

[root@localhost ~]#jobs
[1]-  Stopped                 cp -i -r /data/* /opt/
[2]+  Stopped                 top

bg(继续任务)

 [root@localhost ~]# dd if=/dev/zero of=/data/aa/f1 bs=1G count=10    
 ^Z
 [1]+  已停止               dd if=/dev/zero of=/data/aa/f1 bs=1G count=10
 [root@localhost ~]# jobs          //查看后台任务列表,任务是停止状态
 [1]+  已停止               dd if=/dev/zero of=/data/aa/f1 bs=1G count=10
 [root@localhost ~]# bg 1          //让暂停的后台任务,变成继续执行
 [1]+ dd if=/dev/zero of=/data/aa/f1 bs=1G count=10 &
 [root@localhost ~]# jobs          //查看任务列表,进程是运行状态
 [1]+  运行中               dd if=/dev/zero of=/data/aa/f1 bs=1G count=10 &

结束进程

kill

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

killall

killall [选项] [信号] 进程名
  • -i:交互式,询问是否要杀死某个进程;
  • -I:忽略进程名的大小写;

pkill

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

进程的优先级设置

进程优先级os

每个CPU在一个时间点上只能处理一个进程,通过时间分片技术,来同时运行多个进程。每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。

在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。数值越小,优先级越高,该进程越优先被 CPU 处理。

不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。

 PRI (最终值) = PRI (原始值) + NI

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

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

nice(启动具有不同nice级别的进程)

 nice -n 优先级 命令
#将程序停止
# ps -ef |grep crond
# kill PID# systemctl stop crond

#启动并制定优先级
# nice -n -10 crond

#确认优先级
# ps -ef |grep crond
PID
# top -p PID

renice(更改现有进程的nice级别)

renice -n 优先级 -p PID   //修改现有进程的nice级别
 [root@localhost ~]# top -p 4657             //查看68219进程的nice级别,为0
 [root@localhost ~]# renice -n -10 -p 4657   //将68219进程的nice级别修改为-10
 68219 (进程 ID) 旧优先级为 0,新优先级为 -10
 [root@localhost ~]# top -p 4657             //修改后的nice级别为-10

计划任务

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]

时间格式说明:

格式用法
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 天之后的此时此刻执行。

示例:

 [root@localhost ~]# at 20:00 2022-10-9    //在2022年10月9日20:00执行任务
 at> touch /tmp/test/1.txt                 //设置具体任务,在/tmp/test 目录下创建文件
 at> <EOT>                                  //按ctrl+d 提交任务
 job 5 at Sun Oct 10 20:00:00 2022          //任务已成功设置
 [root@localhost ~]# atq                    //查看at任务列表
 5       Sun Oct 10 20:00:00 2022 a root

crontab(周期性任务设置)

crontab [选项] [file]
选项功能
-u user用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。
-e编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i在删除用户的 crontab 文件时,给确认提示。
[root@localhost ~]# cat /etc/crontab
#查看/etc/crontab文件
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

使用 "crontab -e" 进入 crontab 编辑界面。会打开vim编辑你的任务,输入格式为:

* * * * * 执行的任务

不同*的含义

项目含义范围
第一个"*"一小时当中的第几分钟(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 分钟就执行一次命令。

示例

 0 17 * * 1-5      //周一到周五每天17:00
 30 8 * * 1,3,5    //每周一、三、五的8:30
 0 8-18/2 * * *    //8点到18点之间每2小时
 0 * */3 * *       //每3天的每个整点

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

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