目录
- 1 进程和内存管理
- 1.1 什么是进程
- 1.2 进程结构
- 1.3 进程相关概念
- 1.3.1 物理地址空间和虚拟地址空间
- 1.3.2 用户和内核空间
- 1.3.3 C代码和内存布局之间的对应关系
- 1.3.4 进程使用内存问题
- 1.3.4.1 内存泄漏: Memory Leak
- 1.3.4.2 内存溢出: Memory Overflow
- 1.3.4.3 内存不足: OOM
- 1.4 进程状态
- 1.5 LRU 算法
- 1.6 IPC 进程间通信
- 1.7 进程优先级
- 1.8 进程分类
- 1.9 IO调度算法
- 2 进程管理和性能相关工具
- 2.1 进程树 pstree
- 2.2 进程信息 ps
- 2.3 查看进程信息 prtstat
- 2.4 设置和调整进程优先级 nice、renice
- 2.5 搜索进程
- 2.6 负载查询 uptime
- 2.7 显示CPU相关统计 mpstat
- 将进程与某一cpu绑定:
- 2.8 查看进程实时状态 top
- 2.9 free 内存空间
- 2.10 进程对应的内存映射pmap
- 2.11 虚拟内存信息vmstat
- 2.12 统计CPU和设备IO信息 iostat
- 2.13 系统资源统计 dstat
- 2.14 监视磁盘I/0 iotop
- 2.15 显示网络带宽使用情况iftop
- 2.16 查看网络实时吞吐量nload
- 2.17 综合监控工具 glances
- 2.18 查看进程打开文件 lsof
- 2.19 C8 新特性 cockpit
- 2.20 信号发送 kill
- 2.21 作业管理
- 2.22 并行运行
- 3 任务计划
- 3.1 一次性任务
- 3.2 周期性任务计划 cron
- 3.2.1 系统cron计划任务
- 3.2.2 anacron
- 3.2.3 管理临时文件
- 3.2.4 用户计划任务
1 进程和内存管理
内核功用:进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等
1.1 什么是进程
Process:正在运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
- 进程ID (Process ID,PID) 号码被用来标记各个进程
- UID、GID、和SELinux语境决定对文件系统的存取和访问权限
- 通常从执行进程的用户来继承
- 存在生命周期
进程创建:
- init:第一个进程,C7后为systemd
- 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write
进程,线程和协程
- 进程:公司
- 线程:threads,员工,至少一个
进程和线程的运行由操作系统分配,而不是开发人员;协程由开发人员分配
pstree -p 下,红色{}括号的是多线程,黄色单一的是单线程
查看进程中的线程
cat /proc/PID/status |grep -i threads
[root@CentOS8 ~]#cat /proc/1948/status | grep -i threads
Threads: 1
查看进程的pid
pidof 进程
1.2 进程结构
内核把进程存放在叫做任务队列(task list)的双向循环链表中
链表中的每一项都是类型为task struct,称为进程控制块(Processing Control Block)PCB中包含一个具体进程的所有信息
进程控制块PCB包含信息
- 进程id、用户id和组id
- 程序计数器
- 进程的状态(有就绪、运行、阻塞)
- 进程切换时需要保存和恢复的CPU寄存器的值
- 描述虚拟地址空间的信息
- 描述控制终端的信息
- 当前工作目录
- 文件描述符表,包含很多指向file结构体的指针
- 进程可以使用的资源上限(ulimit -a命令可以查看)
- 输入输出状态:配置进程使用I/O设备
1.3 进程相关概念
Page Frame: 页框,用存储页面数据,存储Page 4k
[root@CentOS8 ~]#getconf -a | grep -i page
PAGESIZE 4096
PAGE_SIZE 4096
1.3.1 物理地址空间和虚拟地址空间
**MMU,Memory Management Unit 内存管理单元:**负责虚拟地址转换为物理地址
程序在访问一个内存地址指向的内存时,CPU不是直接把这个地址送到内存总线上,而是被送到MMU (Memory Management Unit),然后把这个内存地址映射到实际的物理内存地址上,然后通过总线再去访问内存,程序操作的地址称为虚拟内存地址
**TLB,Translation Lookaside Buffer 翻译后备缓冲器:**用于保存虚拟地址和物理地址映射关系的缓存
1.3.2 用户和内核空间
1.3.3 C代码和内存布局之间的对应关系
每个进程都包括5种不同的数据段
- 代码段:用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作一一它是不可写的
- 数据段:用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量
- BSS段:Block Started by symbo"的缩写,意为“以符号开始的块,BSS段包含了程序中未初始化的全局变量,在内存中 bss段全部置零
- 堆(heap):存放数组和对象,堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除 (堆被缩减)
- 栈;栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧”0”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并目待到调用结束后,函数的返回值也会被存放回栈中。由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场。可以把堆栈看成一个寄存、交换临时数据的内存区
栈的先进后出:
1.3.4 进程使用内存问题
1.3.4.1 内存泄漏: Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
1.3.4.2 内存溢出: Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出
1.3.4.3 内存不足: OOM
OOM 即 Out Of Memory,“内存用完了”,在情况在iava程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
当JVM因为没有足够的内存来为对象分配空间并 且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理)
原因:
- 给应用分配内存太少:比如虚拟机本身可使用的内存 (一般通过启动时的VM参数指定)太少
- 应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
- 限制iava进程的max heap,并且降低iava程序的worker数量,从而降低内存使用
- 给系统增加swap空间
设置内核参数 (不推荐),不允许内存申请过量:
echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio
echo 2 > /proc/sys/vm/panic_on_oom
例:
[root@CentOS8 ~]#cat /proc/sys/vm/overcommit_memory
0
[root@CentOS8 ~]#cat /proc/sys/vm/overcommit_ratio
50
说明:
Linux默认允许memory overcommit(超分),只要你来申请内存我就给你,寄希望于进程实际上用不到那么多内存,但万一用到那么多了呢? Linux设计了一个OOM killer机制挑选一个进程出来杀死,以腾出部分内存,如果还不够就继续。也可通过设置内核参数 vm.panic_on_oom 使得发生OOM时自动重启系统。这都是有风险的机制,重启有可能造成业务中断,杀死进程也有可能导致业务中断。所以Linux 2.6之后允许通过内核参数 vm.overcommit_memory 禁止memory overcommit
vm.panic_on_oom 决定系统出现oom的时候,要做的操作。接受的三种取值如下
0 默认值,当出现oom的时候,触发oom killer
1 程序在有cpuset、memory policy、memcg的约束情况下的OOM,可以考虑不panic,而是启动OOM killer。其它情况触发 kernel panic,即系统直接重启
2 当出现oom,直接触发kernel panic,即系统直接重启
vm.overcommit_memory 接受三种取值:
0 Heuristic overcommit handling.这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
1 Always overcommit,允许overcommit,对内存申请来者不拒。内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
2 Don’t overcommit,禁止overcommit。 内存拒绝等于或者大于总可用 swap 大小以及overcommit_ratio 指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。
Heuristic overcommit算法:
单次申请的内存大小不能超过以下值,否则本次申请就会失败。
free memory + free swap + pagecache的大小 + SLAB
vm.overcommit memory=2 禁止overcommit,那么怎样才算是overcommit呢?
kernel设有一个闽值,申请的内存总数超过这个闻值就算overcommit,在/proc/meminfo中可以看到这个闯值的大小:
[root@CentOS8 ~]# grep -i commit /proc/meminfo
CommitLimit: 9387008 kB
Committed_AS: 2663392 kB
CommitLimit 就是overcommit的阈值,申请的内存总数超过CommitLimit的话就算是overcommit。此值通过内核参数vm.overcommit_ratio或vm.overcommit_kbytes间接设置的,公式如下:
CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap
vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%。如果你不想使用比率,也可以直接指定内存的字节数大小,通过另一个内核参数vm.overcommit kbytes 即可;
如果使用了huge pages,那么需要从物理内存中减去,公式变成:
CommitLimit = ([total RAM] - [total huge TLB RAM]) * vm.overcommit_ratio / 100 + swap
proc/meminfo中的 Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的,不是已经分配的),如果 Committed_AS 超过CommitLimit 就表示发生了 overcommit,超出越多表示overcommit 越严重。Committed_AS 的含义换一种说法就是,如果要绝对保证不发生OOM(out ofmemory) 需要多少物理内存。
1.4 进程状态
进程的基本状态
- 创建状态: 进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态: 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件 (I/0请求,申请缓存区失败)而暂时无法运行,
- 进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态: 进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
状态之间转换六种情况
- 运行–>就绪: 1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU该进程便由执行状态转变为就绪状态
- 就绪一>运行: 运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
- 运行一>阻塞: 正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/0请求
- 阻塞一>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
- 阻塞—>运行: 即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
- 就绪一>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
进程更多的状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被CPU调度,除非手动启动
- 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭。kill父进程将其关闭,或恢复父进程将其回收
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkDRG3aF-1692200722588)(C:\Users\HUIO\AppData\Roaming\Typora\typora-user-images\10、进程、系统性能和计划任务\image-20230814155425198.png)]
1.5 LRU 算法
LRU:Least Recently Used 近期最少使用算法(推陈出新)释放内存
例:
假设序列为 4 3 4 2 3 1 4 2,物理块有3个,则
第1轮 4调入内存 4
第2轮 3调入内存 3 4
第3轮 4调入内存 4 3
第4轮 2调入内存 2 4 3
第5轮 3调入内存 3 2 4
第6轮 1调入内存 1 3 2
第7轮 4调入内存 4 1 3
第8轮 2调入内存 2 4 1
1.6 IPC 进程间通信
IPC:Inter Process Communication
同一主机:
pipe 管道,单向传输,一次只能一个读或一个写
socket 套接字文件
Memory-maped file 文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
signal 信号
shm shared memory 共享内存
Lock 对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
semaphore 信号量,一种计数器
不同主机:socket=IP和端口号
RPC remote procedure call
MQ 消息队列,生产者和消费者,如: Kafka,RabbitMQ,ActiveMQ
例:利用管道实现IPC
[root@centos8 ~]#mkfifo /data/test.fifo #创建管道文件
[root@centos8 ~]#ll /data/test.fifo
prw-r--r-- 1 root root 0 May 6 14:32 /data/test.fifo
[root@centos8 ~]#cat > /data/test.fifo
hello
#在另一个终端可以从文件中读取数据
[root@centos8_2 ~]#cat /data/test.fifo
hello
例:查找socket文件,显示前5个的详细信息
[root@CentOS8 ~]#find / -type s -ls | head -5
27023 0 srw-rw-rw- 1 root root 0 Aug 14 12:01 /run/vmware/guestServicePipe
26824 0 srw-rw-rw- 1 root root 0 Aug 14 12:01 /run/.heim_org.h5l.kcm-socket
26821 0 srw-rw-rw- 1 root root 0 Aug 14 12:01 /run/avahi-daemon/socket
26815 0 srw-rw-rw- 1 root root 0 Aug 14 12:01 /run/dbus/system_bus_socket
41385 0 srwxrwxrwx 1 mysql mysql 0 Aug 14 12:01 /run/mysqld/mysqlx.sock
1.7 进程优先级
Linux2.6内核将任务优先级进行了一个划分,实时优先级范围是0到MAX_RT_PRIO-1(即99),而普通进程的静态优先级范围是从MAX_RT_PRIO-A到MAX_PRIO-1(即100到139)
优先级范围 | 描述 |
---|---|
0——99 | 实时进程 |
100——139 | 非实时进程 |
CentOS优先级
进程优先级
系统优先级:数字越小,优先级越高
-
0-139 (C4,5),各有140个运行队列和过期(就绪)队列
-
0-98,99 (C6)
实时优先级:99-0 值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
Big o:时间 (空间) 复杂度,用时 (空间) 和规模的关系
O(1), O(logn),0(n)线性, o(n^2)抛物线, o(2n)
1.8 进程分类
操作系统分类:
- 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用 CPU否则将完全霸占 CPU,所以任务之间需要协作一一使用一段时间的 CPU ,主动放弃使用
- 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务
进程类型:
- 守护进程:daemon,在系统引导过程中启动的进程,和终端无关进程
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
按进程资源使用的分类:
- CPU-Bound:CPU密集型,非交互
- lO-Bound:IO密集型,交互
1.9 IO调度算法
在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下:
-
NOOP
NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并并不是完完全全按照先进先出的规则满足IO请求。NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样)。在有些SAN环境下,这个选择可能是最好选择。Noop 对于IO不那么操心,对所有的IO请求都用 FIFO 队列形式处理,默认认为IO 不会存在性能问题。这也使得 CPU 也不用那么操心。当然,对于复杂一点的应用类型,使用这个调度器,用户自己就会非常操心。
-
Deadline scheduler
DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。deadline 算法保证对于既定的 IO请求以最小的延迟时间,除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:
FIFO(Read) > FIFO(Write) > CFQ
-
Anticipatory scheduler
CFQ和DEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法ANTICIPATORY的在DEADLINE的基础上,为每个读0都设置了6ms 的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足 Anticipatory scheduler (as)曾经一度是Linux 2.6 Kernel的IO scheduler 。Anticipatory 的中文含义是预料的,预想的”这个词的确揭示了这个算法的特点,简单的说,有个IO发生的时候,如果又有进程请求IO操作,则将产生一个默认的 6毫秒猜测时间,猜测下一个 进程请求 是要干什么的。这对于随即读取会造成比较大的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也可以简单理解为面向低速磁盘的,因为那个“猜测”实际上的目的是为了减少磁头移动时间
-
CFO
CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照I0请求的地址进行排序,而不是按照先来后到的顺序来进行响应。 在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况。
Completely Fair Queuing (cfq, 完全公平队列)在 2.6.18 取代了 Anticipatory scheduler 成为Linux Kernel 默认的 IO scheduler 。cfg 对每个进程维护一个IO 队列,各个进程发来的IO 请求会被 cfg 以轮循方式处理。也就是对每一个IO请求都是公平的。这使得 cfg 很适合离散读的应用(eg:OLTP DB)
范例: 查看IO调度算法,不同系统版本的算法不同
[root@ubuntu1804 ~]#cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
[root@centos8 ~]#cat /sys/b1ock/sda/queue/scheduler
[mq-deadTine] kyber bfg none
[root@centos7 ~]#cat /sys/b1ock/sda/queue/scheduler
noop [deadline] cfq
[root@centos6 ~]#at /sys/b1ock/sda/queue/scheduler
noop anticipatory deadline [cfq]
2 进程管理和性能相关工具
Linux系统状态的查看及管理工具:pstree,ps,pidof,pgrep,top,htop,glance,pmap,ymstat,dstat,kill,pkill,job,bg,fg,nohup
2.1 进程树 pstree
pstree 可以用来显示进程的父子关系,以树形结构显示
格式:
pstree [OPTION] [ PID | USER ]
常用选项:
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高度指定进程及其前辈进程
2.2 进程信息 ps
ps 即process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps格式
ps [OPTION]...
支持三种选项:
UNIX选项如: -A -e
BSD选项 如: a
GNU选项 如: --help
常用选项
a 选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息
f 选项显示进程树,相当于 --forest
k|--sort 属性 对属性排序,属性前加- 表示倒序 #C6不支持
o 属性... 选项显示定制的信息 pid、cmd、%cpu、%mem
user 有效用户
euser 有效用户
ruser 实际用户
L 显示支持的属性列表
-c cmdlist 指定命令,多个命令用,分隔
-L 显示线程
-e 显示所有进程,相当于ax,不过只有4列信息,没有Status
-f 显示完整格式程序信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称
-U userlist 指定真正的用户ID或名称
-g gid或groupname 指定有效的gid或组名称
-G gid或groupname 指定真正的gid或组名称
-p pid 显示指pid的进程
--ppid pid 显示属于pid的子进程
-t ttylist 指定tty,相当于 t
-M 显示SELinux信息,相当于Z
例:
[root@CentOS8 ~]#ps
PID TTY TIME CMD
241118 pts/0 00:00:00 bash
242941 pts/0 00:00:00 ps
[root@CentOS8 ~]#ps a
PID TTY STAT TIME COMMAND
241118 pts/0 Ss 0:00 -bash
242618 tty1 Ss+ 0:00 -bash
243452 pts/0 R+ 0:00 ps a
[root@CentOS8 ~]#ps -a
PID TTY TIME CMD
243465 pts/0 00:00:00 ps
[joyce@CentOS8 root]$passwd
Changing password for user joyce.
Current password:
[root@CentOS8 ~]#ps axo pid,ppid,cmd,%mem,%cpu,user,euser,ruser | grep passwd
252167 252120 passwd 0.4 0.0 root root joyce
252779 241118 grep --color=auto passwd 0.0 0.0 root root root
ps输出属性
C : ps -ef 显示列 C 表示cpu利用率
VSZ: virtual memory size,虚拟内存集,线性内存
RSS: Resident size,常驻内存集
STAT:进程状态
R: running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
1: 多线程进程
L: 内存分页并带锁
N: 低优先级进程
<: 高优先级进程
s: session leader,会话 (子进程) 发起者
I: Idle kernel thread 空闲的内核线程,C8后才有
ni: nice值
pri: priority优先级 139-0,倒叙,ni为-20,pri则为39;ni为0,pri为19;ni为19,pri为0
rtprio: 实时优先级,99-0,pri为139,rtprio为99
psr: processor CPU编号
示例:
ps axo pid,cmd,psr,ni,pri,rtprio
常用组合
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pripsr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
示例:
#查询你拥有的所有进程
ps -x
#显示指定用户名(RUID)或用户ID的进程
ps -fU apache
ps -fu 48
#显示指定用户名(EUID)或用户ID的进程
ps -fu wang
ps -fu 1000
#查看以root用户权限(实际和有效ID) 运行的每个进程
ps -U root -u root
#列出某个组拥有的所有进程(实际组ID: RGID或名称)
ps -fG nginx
#列出有效组名称(或会话) 所拥有的所有进程
ps -fg mysql
ps -fg 27
#显示指定的进程ID对应的进程
ps -fp 1234
#以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程
ps -f --ppid 1234
#显示指定PID的多个进程
ps -fp 1204,1239,1263
#要按tty显示所属进程
ps -ft pts/0
#以进程树显示系统中的进程如何相互链接
ps -e --forest
#以进程树显示指定的进程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
#要显示一个进程的所有线程,将显示LwP (轻量级进程) 以及NLWP (轻量级进程数) 列
ps -fL -C nginx
#要列出所有格式说明符
ps L
#查看进程的PID,PPID,用户名和命令
ps -eo pid,ppid,user ,cmd
#自定义格式显示文件系统组,ni值开始时间和进程的时间
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
#使用其PID查找进程名称:
ps -p 1244 -o comm=
#要以其名称选择特定进程,显示其所有子进程
ps -C sshd,bash
#查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
ps -C httpd,sshd -o pid=
#检查一个进程的执行时间
ps -eo comm,etime,user | grep nginx
#排序,查找占用最多内存和CPU的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
ps -eo pid,ppid,cmd,%mem,%cpu k -%mem | head #以cpu占用率降序排序
#显示安全信息
ps -eM
ps --context
#使用以下命令以用户定义的格式显示安全信息
ps -eo euser,ruser,suser,fuser,f,comm,label
#使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
例:以cpu占用率降序排序
[root@CentOS8 ~]#ps -eo pid,ppid,cmd,%mem,%cpu k -%mem | head
PID PPID CMD %MEM %CPU
1467 1 /usr/sbin/mysqld 20.9 0.5
234035 1 /usr/libexec/packagekitd 3.1 0.0
938 843 /usr/libexec/sssd/sssd_nss 2.0 0.0
909 1 /usr/libexec/platform-pytho 2.0 0.5
855 1 /usr/lib/polkit-1/polkitd - 1.4 0.0
857 1 /usr/sbin/NetworkManager -- 1.0 0.0
906 843 /usr/libexec/sssd/sssd_be - 0.7 0.0
例:查看优先级和cpu绑定关系
[root@CentOS8 ~]#ps axo pid,cmd,ni,pri,psr | grep -i dd
2 [kthreadd] 0 19 2
239 [ipv6_addrconf] -20 39 2
283257 grep --color=auto -i dd 0 19 1
2.3 查看进程信息 prtstat
可以显示进程信息,来自于psmisc包
格式:
prtstat [options] PID .
-r raw 格式显示
例:
[root@CentOS8 ~]#prtstat 267972
Process: su State: S (sleeping)
CPU#: 0 TTY: 136:1 Threads: 1
Process, Group and Session IDs
Process ID: 267972 Parent ID: 252120
Group ID: 267972 Session ID: 252019
T Group ID: 282649
Page Faults
This Process (minor major): 548 0
Child Processes (minor major): 245 0
CPU Times
This Process (user system guest blkio): 0.00 0.00 0.00 0.00
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 156 MB
RSS: 7770 kB RSS Limit: 18446744073709 MB
Code Start: 0x5564bf35d000 Code Stop: 0x5564bf366a90
Stack Start: 0x7ffe685d6700
Stack Pointer (ESP): 0 Inst Pointer (EIP): 0
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
2.4 设置和调整进程优先级 nice、renice
进程优先级调整
- 静态优先级:100-139
- 进程默认启动时的nice值为0,优先级为120
- 只有根用户才能降低nice值 (提高优先性)
- 设置成超过19的值,nice将自动设置为19
nice命令:以指定的优先级来启动进程
nice [OPTION] [COMMAND [ARG]...]
-n, --adjustment=N add integer N to the niceness (default 10)
renice命令:调整正在执行中进程的优先级
renice [-n] priority pid...
查看
ps axo pid,comm,ni
例:
[root@CentOS8 ~]#ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.298 ms
[root@CentOS8 ~]#ps axo pid,cmd,nice | grep -i ping
267131 ping 10.0.0.1 0
[root@CentOS8 ~]#nice -n 10 ping 10.0.0.1 #以10运行ping
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.298 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.762 ms
[root@CentOS8 ~]#ps axo pid,cmd,nice | grep -i ping
267638 ping 10.0.0.1 10
[root@CentOS8 ~]#renice -n -10 267638 #将运行中的ping调成-10
267638 (process ID) old priority 10, new priority -10
[root@CentOS8 ~]#ps axo pid,cmd,nice | grep -i ping
267638 ping 10.0.0.1 -10
2.5 搜索进程
按条件搜索进程
ps 选项 | grep 'pattern' 灵活
pgrep 按预定义的模式
·/sbin/pidof 按确切的程序名称查看pid
pgrep 命令格式
pgrep [options] pattern
常用选项
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
例:
[root@CentOS8 ~]#pgrep -alU joyce
252120 bash
267972 su root
#注意:由于U后要跟用户名,所以U要放在选项最后,下面的-t同理
[root@CentOS8 ~]# w
20:31:04 up 21:42, 4 users, load average: 0.19, 0.08, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 10:48 8:29m 0.10s 0.10s -bash
root tty1 - 10:52 9:38m 0.23s 0.23s -bash
root pts/1 10.0.0.1 11:18 0.00s 0.08s 0.00s w
[root@CentOS8 ~]#pgrep -at pts/1
252019 -bash
252119 su joyce
252120 bash
267972 su root
267981 bash
pidof 格式
pidof [options] [program [...]]
-x 脚本名称 :按脚本名称查找pid,必须加-x,且是脚本
2.6 负载查询 uptime
/proc/uptime 包括两个值,单位 s
- 系统启动时长
- 空闲进程的总时长 (按总的CPU核数计算)
uptime 和 w显示以下内容
- 当前时间
- .系统已启动的时间
- 当前上线人数
- 系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)
系统平均负载:指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如:linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用,一般别超过5
[root@CentOS8 ~]#uptime #与下面第一行相同
20:37:53 up 21:49, 4 users, load average: 0.11, 0.09, 0.07
[root@CentOS8 ~]#w
20:38:17 up 21:49, 4 users, load average: 0.20, 0.12, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 10:48 8:36m 0.10s 0.10s -bash
2.7 显示CPU相关统计 mpstat
来自于sysstat包
例:
[root@CentOS8 ~]#mpstat
Linux 4.18.0-348.el8.x86_64 (CentOS8.Joyce.person1) 08/15/2023 _x86_64_ (4 CPU)
08:46:01 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:46:01 PM all 0.03 0.00 0.27 0.00 0.13 0.05 0.00 0.00 0.00 99.52
[root@CentOS8 ~]#mpstat 1 #实时记录,每1秒更新一次
Linux 4.18.0-348.el8.x86_64 (CentOS8.Joyce.person1) 08/15/2023 _x86_64_ (4 CPU)
08:46:47 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:46:48 PM all 0.00 0.00 0.74 0.00 0.00 0.25 0.00 0.00 0.00 99.01
08:46:49 PM all 0.00 0.00 0.00 0.00 0.50 0.00 0.00 0.00 0.00 99.50
08:46:50 PM all 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.50
08:46:51 PM all 0.00 0.00 0.00 0.00 0.25 0.50 0.00 0.00 0.00 99.26
[root@CentOS8 ~]#mpstat 1 3 #实时记录,每1秒更新一次,记录3次后退出
Linux 4.18.0-348.el8.x86_64 (CentOS8.Joyce.person1) 08/15/2023 _x86_64_ (4 CPU)
08:52:09 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:52:10 PM all 0.00 0.00 0.00 0.00 0.25 0.00 0.00 0.00 0.00 99.75
08:52:11 PM all 0.00 0.00 0.49 0.00 0.00 0.00 0.00 0.00 0.00 99.51
08:52:12 PM all 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.75
Average: all 0.00 0.00 0.25 0.00 0.08 0.00 0.00 0.00 0.00 99.67
对于其中的%steal:我们打开Windows的任务管理器,只能看到VMware程序,但看不到里面显示的C8系统和其中运行的dd、mpstat等的命令,这就叫steal
将进程与某一cpu绑定:
[root@CentOS8 ~]#taskset --help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]
2.8 查看进程实时状态 top
top 提供动态的实时进程状态
例:
[root@CentOS8 ~]#top #按CPU利用率排序,默认显示,或进入后按P键显示
top - 20:56:05 up 22:07, 3 users, load average: 0.05, 0.11, 0.09
Tasks: 191 total, 1 running, 190 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.4 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
MiB Mem : 1950.0 total, 430.3 free, 775.6 used, 744.2 buff/cache
MiB Swap: 8192.0 total, 8192.0 free, 0.0 used. 982.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
909 root 20 0 577928 41556 19700 S 0.7 2.1 7:09.09 tuned
1467 mysql 20 0 2374564 418748 35864 S 0.3 21.0 7:23.91 mysqld
1 root 20 0 246588 11032 7992 S 0.0 0.6 0:04.95 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd
[root@CentOS8 ~]#top #以内存利用率排序,进入后按M显示
top - 20:56:53 up 22:08, 3 users, load average: 0.02, 0.09, 0.08
Tasks: 191 total, 1 running, 190 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.2 hi, 0.1 si, 0.0 st
MiB Mem : 1950.0 total, 430.0 free, 775.8 used, 744.2 buff/cache
MiB Swap: 8192.0 total, 8192.0 free, 0.0 used. 982.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1467 mysql 20 0 2374564 418748 35864 S 0.3 21.0 7:24.12 mysqld
234035 root 20 0 545356 63696 25444 S 0.0 3.2 0:01.25 packagekitd
909 root 20 0 577928 41556 19700 S 0.3 2.1 7:09.35 tuned
938 root 20 0 229268 40920 39084 S 0.0 2.0 0:01.26 sssd_nss
帮助: h或?,按g 或esc 退出帮助
排序:
P: CPU占用率排序,%CPU
M: 内存占用率排序,%MEM
T: 累积占据CPU时长排序,TIME+
首部信息显示
uptime信息: l命令
tasks及cpu信息: t命令
cpu分别显示: 1(数字)
memory信息: m命令
退出命令: q
修改刷新时间间隔: s
终止指定进程
保存文件 W
top命令栏位信息简介
us: 用户空间
sy: 内核空间
ni: 调整nice时间
id: 空闲
wa: 等待IO时间
hi: 硬中断
si: 软中断 (模式切换)
st: 虚拟机偷走的时间
top选项
-d# 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n# 刷新多少次后退出
-H 线程模式
增强版top:
htop命令:来自EPEL源,比top功能更强
选项:
-d #:指定延迟时间
-u UserName: 仅显示指定用户的进程
-s COLUME: 以指定字段进行排序
子命令
s 跟踪选定进程的系统调用
l 显示选定进程打开的文件列表
a 将选定的进程绑定至某指定CPU核心
t 显示进程树
2.9 free 内存空间
free 可以显示内存空间使用状态
格式:
free [OPTION]
常用选项
-b 以字节为单位
-m 以MB为单位
-g 以GB为单位
-h 易读格式
-o 不显示-/+buffers/cache行
-t 显示RAM + swap的总和
-s n 刷新间隔为n秒
-c n 刷新n次后即退出
例:
[root@CentOS8 ~]#free -h
total used free shared buff/cache available
Mem: 1.9Gi 714Mi 385Mi 9.0Mi 849Mi 1.0Gi
Swap: 8.0Gi 0B 8.0Gi
[root@CentOS8 ~]#echo 3 > /proc/sys/vm/drop_caches #清理buff和cache,不建议使用
[root@CentOS8 ~]#free -h
total used free shared buff/cache available
Mem: 1.9Gi 644Mi 1.1Gi 9.0Mi 162Mi 1.1Gi
Swap: 8.0Gi 0B 8.0Gi
2.10 进程对应的内存映射pmap
格式:
pmap [options] pid [...]
-x 显示详细格式的信息
范例:
[root@CentOS8 ~]#pmap 498757
498757: /usr/sbin/mysqld
0000000000400000 8608K r---- mysqld
0000000000c68000 31924K r-x-- mysqld
0000000002b95000 17908K r---- mysqld
0000000003d13000 1584K r---- mysqld
0000000003e9f000 3708K rw--- mysqld
000000000423e000 5340K rw--- [ anon ]
另外一种实现
cat /proc/PID/maps
strace
查看命令执行过程中的系统调用
strace CMD
ltrace
查看命令执行过程中的(C语言)库调用
ltrace CMD
2.11 虚拟内存信息vmstat
格式:
vmstat [options] [delay [count]]
显示项说明:
procs:
r: 可运行 (正运行或等待运行) 进程的个数,和核心数有关
b: 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd: 交换内存的使用总量
free: 空闲物理内存总量
buffer: 用于buffer的内存总量
cache: 用于cache的内存总量
swap:
si: 从磁盘交换进内存的数据速率(kb/s)
so: 从内存交换至磁盘的数据速率(kb/s)
io:
bi: 从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system:
in: interrupts 中断速率,包括时钟
cs: context switch 进程切换速率
cpu:
us: Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for Io. 2.5.41前,包括in idle
st: Time stolen from a virtual machine. 2.6.11前,unknown.
例:
[root@CentOS8 ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 812056 96 434372 0 0 3 1 103 41 0 0 100 0 0
[root@CentOS8 ~]#vmstat 1 3 #1秒刷新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
1 0 0 811900 96 434364 0 0 3 1 103 41 0 0 100 0 0
0 0 0 811600 96 434364 0 0 0 0 398 653 0 0 100 0 0
0 0 0 811652 96 434364 0 0 0 0 374 632 0 1 99 0 0
[root@CentOS8 ~]#vmstat -s #汇总
1996812 K total memory
750372 K used memory
206644 K active memory
700528 K inactive memory
811980 K free memory
96 K buffer memory
434364 K swap cache
8388604 K total swap
0 K used swap
8388604 K free swap
2.12 统计CPU和设备IO信息 iostat
此工具由sysstat包提供
例:
[root@CentOS8 ~]#iostat
Linux 4.18.0-348.el8.x86_64 (CentOS8.Joyce.person1) 08/16/2023 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.46 0.01 0.00 99.50
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.85 397.52 4.72 37008095 439784
scd0 0.00 0.01 0.00 1042 0
[root@CentOS8 ~]#iostat 1 3 #每1秒执行一次,共执行3次
Linux 4.18.0-348.el8.x86_64 (CentOS8.Joyce.person1) 08/16/2023 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.46 0.01 0.00 99.50
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.85 397.51 4.72 37008095 439784
scd0 0.00 0.01 0.00 1042 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.74 0.00 0.00 99.26
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.25 0.00 0.00 99.75
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
scd0 0.00 0.00 0.00 0 0
2.13 系统资源统计 dstat
dstat由pcp-system-tools包提供,用于代替ymstat,iostat功能
格式:
dstat [-afv] [options..] [delay [count]]
常用选项
-c 显示cpu相关信息
-C #,#,...,total
-d 显示disk相关信息
-D total,sda,sdb,...
-g 显示page相关统计数据
-m 显示memory相关统计数据
-n 显示network相关统计数据
-p 显示process相关统计数据
-r 显示io请求相关的统计数据
-s 显示swapped相关的统计数据
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu 显示最占用CPU的进程
--top-io 显示最占用io的进程
--top-mem 显示最占用内存的进程
--top-latency 显示延迟最大的进程
例:
[root@CentOS8 ~]#dstat
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 99 0 0| 0 0 | 316B 1253B| 0 0 | 389 667
0 0 99 0 0| 0 0 | 319B 1123B| 0 0 | 394 666
0 1 99 0 0| 0 0 | 545B 1179B| 0 0 | 392 672
0 0 99 0 0| 0 0 | 318B 1054B| 0 0 | 363 597
1 1 98 0 0|1365k 0 | 525B 706B| 0 0 |1084 1513
0 0 99 0 0| 0 0 | 494B 1318B| 0 0 | 387 637
1 15 74 7 0| 511M 115k| 486B 1202B| 0 28.8 |1952 856
3 19 69 5 0| 594M 141k| 531B 747B| 0 35.3 |2863 1293
[root@CentOS8 ~]#dstat 1 3 #每1秒一次,共3次
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 99 0 0| 0 0 | 535B 1331B| 0 0 | 405 727
0 0 99 0 0| 0 0 | 253B 1063B| 0 0 | 397 706
0 0 99 0 0| 0 0 | 391B 1126B| 0 0 | 373 648
2.14 监视磁盘I/0 iotop
iotop命令是一个用来监视磁盘/0使用状况的top类丁具iotop具有与top相似的UI,其中包括PID、用户、I/0、进程等相关信息,可查看每个进程是如何使用IO
iotop输出
第一行:Read和Write速率总计
第二行:实际的Read和Write速率
第三行:参数如下
- 线程ID (按p切换为进程ID)
- 优先级
- 用户
- 磁盘读速率
- 磁盘写速率
- swap交换百分比
- IO等待所占的百分比
iotop常用参数
-o,--only 只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效
-b,--batch 非交互模式,一般用来记录日志
-n NUM,--iter=NUM 设置监测的次数,默认无限。在非交互模式下很有用
-d SEC,--delay=SEC 设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
-p PID,--pid=PID 指定监测的进程/线程
-u USER,--user=USER 指定监测某个用户产生的I/O
-P,--processes 仅显示进程,默认iotop显示所有线程
-a,--accumulated 显示累积的I/0,而不是带宽
-k,--kilobytes 使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用
iotop 常用参数和快捷键
-t,--time 加上时间戳,非交互非模式
-q,--quiet 禁止头几行,非交互模式,有三种指定方式
q 只在第一次监测时显示列名
-qq 永远不显示列名
-qqq 永远不显示I/0汇总
交互按键
left和right方向键 改变排序
r 反向排序
o 切换至选项--only
p 切换至--processes选项
a 切换至--accumulated选项
q 退出
i 改变线程的优先级
2.15 显示网络带宽使用情况iftop
选项
-n 不显示具体的名称,只显示地址
例:iftop -n
2.16 查看网络实时吞吐量nload
nload 是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况,通过EPEL源安装
界面操作
- 上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
- 按 F2显示选项窗口
- 按 q 或者 Ctrl+C 退出 nload
例:
#默认只查看第一个网络的流量进出情况
nload
#在nload后面指定网卡,可以指定多个,按左右键分别显示网卡状态
nload eth0 ethl
#设置刷新间隔:默认刷新间隔是100毫秒,可通过 -t 命令设置刷新时间(单位是毫秒)
nload -t 500 eth0
#设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s
#-u hlblkmlg H B K|M G 表示的含义: h: auto,b: Bit/s,k: kBit/s,
#m: MBit/s,H:auto,B: Byte/s , K: kByte/s , M: MByte/s
nload -u M eth0
2.17 综合监控工具 glances
此工具可以通过EPEL源安装,C8 目前没有提供
格式
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
内建命令:
a Sort processes automatically
c Sort processes by CPU%
m Sort processes by MEM%
p Sort processes by name
i Sort processes by I/0 rate
d Show/hide disk I/0 stats
f Show/hide file system stats
n Show/hide network stats
s Show/hide sensors stats
y Show/hide hddtemp stats
I show/hide logs
b Bytes or bits for network I/0
w Delete warning logs
x Delete warning and critical logs
1 Global CPU or per-CPU stats
h Show/hide this help screen
t View network I/O as combination
u View cumulative network I/O
q Quit (Esc and Ctrl-C also work)
常用选项:
-b 以Byte为单位显示网卡数据速率
-d 关闭磁盘I/O模块
-f /path/to/somefile: 设定输入文件位置
-o {HTML|CSV}: 输出格式
-m 禁用mount模块
-n 禁用网络模块
-t #: 延迟时间间隔
-1 每个CPU的相关数据单独显示
C/S模式下运行glances命令
-
服务器模式:
-
glances -s -B IPADDR
IPADDR:指明监听的本机哪个地址
-
-
客户端模式:
-
glances -c IPADDR
IPADDR:要连入的服务器端地址
-
2.18 查看进程打开文件 lsof
lsof:list open files查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符
命令选项:
-a: 列出打开文件存在的进程
-c<进程名>: 列出指定进程所打开的文件
-g: 列出GID号进程详情
-d<文件号>: 列出占用该文件号的进程
+d<目录>: 列出目录下被打开的文件
+D<目录>: 递归列出目录下被打开的文件
-n<目录>: 列出使用NFS的文件
-i<条件>: 列出符合条件的进程(4、6、协议、:端口、 @ip )
-p<进程号>: 列出指定进程号所打开的文件
-u: 列出UID号进程详情
-h: 显示帮助信息
-V: 显示版本信息
-n: 不反向解析网络名字
例:
#查看使用22端口号的程序
[root@CentOS8 ~]#lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 914 root 4u IPv4 30996 0t0 TCP *:ssh (LISTEN)
sshd 914 root 6u IPv6 30998 0t0 TCP *:ssh (LISTEN)
sshd 267015 root 5u IPv4 1136629 0t0 TCP CentOS8.Joyce.person1:ssh->10.0.0.1:57826 (ESTABLISHED)
#查看由登录用户启动而非系统启动的进程
[root@CentOS8 ~]#lsof /dev/pts/0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 516849 root 0u CHR 136,0 0t0 3 /dev/pts/0
bash 516849 root 1u CHR 136,0 0t0 3 /dev/pts/0
bash 516849 root 2u CHR 136,0 0t0 3 /dev/pts/0
bash 516849 root 255u CHR 136,0 0t0 3 /dev/pts/0
dbus-laun 516892 root 0u CHR 136,0 0t0 3 /dev/pts/0
#指定进程号查看该进程的系统调用和库调用
[root@CentOS8 ~]#lsof -p `pidof ping`
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ping 532085 root cwd DIR 8,2 4096 201326721 /root
ping 532085 root rtd DIR 8,2 4096 128 /
ping 532085 root txt REG 8,2 67680 673420 /usr/bin/ping
ping 532085 root mem REG 8,2 2586930 134949200 /usr/lib/locale/en_US.utf8/LC_COLLATE
ping 532085 root mem REG 8,2 321552 67556191 /usr/lib64/libpthread-2.28.so
#查看指定程序打开的文件
[root@CentOS8 ~]# lsof -c ping
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ping 532085 root cwd DIR 8,2 4096 201326721 /root
ping 532085 root rtd DIR 8,2 4096 128 /
ping 532085 root txt REG 8,2 67680 673420 /usr
#查看由指定用户打开的文件
[root@CentOS8 ~]# lsof -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,2 4096 128 /
systemd 1 root rtd DIR 8,2 4096 128 /
systemd 1 root txt REG 8,2 1597064 201999267 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,2 2191840 67556181 /usr/lib64/libm-2.28.so
#查看指定目录下被打开的文件,参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文
lsof +D /var/log/
lsof +d /var/log/
#查看所有网络连接,通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如: sshd等。也可以通过指定ip查看该ip的网络连接情况
lsof -i -n
lsof -i@127.0.0.1
#查看端口连接情况,通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
lsof -i :80 -n
#查看指定进程打开的网络连接,参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
lsof -i -n -a -p 9527
#查看指定状态的网络连接,-n:no host names,-p;no port names,-i TCP指定协议,-S指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
lsof -n -P -i TCP -S TCP:ESTABLISHED
例:还原被占用(使用)时被删除的文件
[root@CentOS8 ~]#ls
dead.letter
#持续占用文件:
[root@CentOS8 ~]#tail -f dead.letter
From: 1299575088@qq.com
To: root@1299575088@qq.com
Subject: test
Message-ID: <64d72df6.kVSBudd1qRZCj5sK%1299575088@qq.com>
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
test
#占用时删除文件
[root@CentOS8 ~]#rm -rf dead*
#可以查到占用dead.letter文件的程序
[root@CentOS8 ~]#lsof dead.letter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 534201 root 3r REG 8,2 302 213406994 dead.letter
[root@CentOS8 ~]#ll /proc/`pidof tail`/fd
total 0
lrwx------ 1 root root 64 Aug 16 13:31 0 -> /dev/pts/0
lrwx------ 1 root root 64 Aug 16 13:31 1 -> /dev/pts/0
lrwx------ 1 root root 64 Aug 16 13:31 2 -> /dev/pts/0
lr-x------ 1 root root 64 Aug 16 13:31 3 -> /root/dead.letter
lr-x------ 1 root root 64 Aug 16 13:31 4 -> anon_inode:inotify
[root@CentOS8 ~]#ll /proc/`pidof tail`/fd/3
lr-x------ 1 root root 64 Aug 16 13:31 /proc/534201/fd/3 -> /root/dead.letter
[root@CentOS8 ~]#cat /proc/`pidof tail`/fd/3 > dead2.letter
[root@CentOS8 ~]#ll dead2.letter
-rw-r--r-- 1 root root 302 Aug 16 13:31 dead2.letter
2.19 C8 新特性 cockpit
Cockpit 是C8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理
- 监控系统活动 (CPU、内存、磁盘 IO 和网络流量)
- 查看系统日志条目
- 查看磁盘分区的容量
- 查看网络活动 (发送和接收)
- 查看用户帐户
- 检查系统服务的状态
- 提取已安装应用的信息
- 查看和安装可用更新 (如果以 root 身份登录)并在需要时重新启动系统
- 打开并使用终端窗口
例:使用cockpit
-
启动服务
#查看cockpit.socet服务是否启动 [root@CentOS8 ~]#systemctl status cockpit.socket ● cockpit.socket - Cockpit Web Service Socket Loaded: loaded (/usr/lib/systemd/system/cockpit.socket; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:cockpit-ws(8) Listen: [::]:9090 (Stream) #启动cockpit.socket服务 [root@CentOS8 ~]#systemctl enable --now cockpit.socket [root@CentOS8 ~]#systemctl status cockpit.socket ● cockpit.socket - Cockpit Web Service Socket Loaded: loaded (/usr/lib/systemd/system/cockpit.socket; enabled; vendor preset: disabled) Active: active (listening) since Wed 2023-08-16 13:38:45 CST; 8s ago Docs: man:cockpit-ws(8) Listen: [::]:9090 (Stream) Tasks: 0 (limit: 12124) Memory: 4.0K CGroup: /system.slice/cockpit.socket Aug 16 13:38:45 CentOS8.Joyce.person1 systemd[1]: cockpit.socket: Succeeded. Aug 16 13:38:45 CentOS8.Joyce.person1 systemd[1]: Closed Cockpit Web Service Socket. Aug 16 13:38:45 CentOS8.Joyce.person1 systemd[1]: Starting Cockpit Web Service Socket. Aug 16 13:38:45 CentOS8.Joyce.person1 systemd[1]: Listening on Cockpit Web Service Socket.
-
浏览器输入当前主机ip和端口号:
10.0.0.201:9090
-
然后输入账密
2.20 信号发送 kill
kil:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头 (可省略),不区分大小写
显示当前系统可用信号
kill -l
trap -l
查看帮助:man 7 signal
常用信号:
1) SIGHUP 无须关闭进程而让其重读配置文件,不影响用户使用,相当于reload
2) SIGINT 中止正在运行的进程:相当于ctr1+c
3) SIGQUIT 相当于ctr7+\
9) SIGKILL 强制杀死正在运行的进程,且无法用trap捕获
15) SIGTERM 终止正在运行的进程,默认信号
16) SIGCONT 继续运行
19) SIGSTOP 后台休眠
例:
[root@CentOS8 ~]#kill -9 516849 #强制杀死516849进程
指定信号的方法:
- 信号的数字标识: 1,2,9
- 信号完整名称: SIGHUP,sighup
- 信号的简写名称: HUP,hup
向进程发送信号:
按PID:
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
范例:
kill -1 pid ...
kill -n 9 pid
kill -s SIGINT pid
按名称:killall来自于psmisc包,不需要使用进程编号,因此会关闭所有的
killall [-SIGNAL] CMD...
按模式:
pkill [options] pattern
常用选项:
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal:与指定终端相关的进程
-l: 显示进程名(pgrep可用)
-a: 显示完整格式的进程名 (pgrep可用)
-ppid: 显示指定进程的子进程
例:使用0信号进行健康性检查,但不完全准确
[root@CentOS8 ~]#man kill
The command kill sends the specified signal to the specified processes or process groups.
#信号0,killall也可使用
[root@CentOS8 ~]#killall -0 ping
[root@CentOS8 ~]#echo $?
0
[root@CentOS8 ~]#killall -0 ping
ping: no process found
[root@CentOS8 ~]#echo $?
1
2.21 作业管理
Linux的作业控制
- 前台作业: 通过终端启动,且启动后一直占据终端
- 后台作业: 可通过终端启动,但启动后即转入后台运行 (释放终端)
让作业运行于后台
运行中的作业:Ctrl+z
尚未启动的作业:CMD &
后台作业虽然被送往后台运行,但其依然与终端相关,退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
nohup CMD &>/dev/null &
screen; CMD
tmx;CMD
查看当前终端所有作业:
jobs
作业控制:
fg [[%]JOB_NUM]: 把指定的后台作业调回前台
bg [[%]JOB_NUM]: 让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 终止指定的作业
2.22 并行运行
利用后台执行,实现并行功能,即同时进行多个进程,提高效率
例1:使用脚本
[root@CentOS8 testdir]#cat bing.sh
ping 10.0.0.205 &
ping 10.0.0.208 &
ping 10.0.0.209 &
#将同时执行
[root@CentOS8 testdir]#bash bing.sh
[root@CentOS8 testdir]#PING 10.0.0.208 (10.0.0.208) 56(84) bytes of data.
PING 10.0.0.205 (10.0.0.205) 56(84) bytes of data.
64 bytes from 10.0.0.208: icmp_seq=1 ttl=64 time=0.397 ms
64 bytes from 10.0.0.205: icmp_seq=1 ttl=64 time=0.289 ms
PING 10.0.0.209 (10.0.0.209) 56(84) bytes of data.
64 bytes from 10.0.0.209: icmp_seq=1 ttl=64 time=0.265 ms
64 bytes from 10.0.0.205: icmp_seq=2 ttl=64 time=0.509 ms
64 bytes from 10.0.0.209: icmp_seq=2 ttl=64 time=0.564 ms
64 bytes from 10.0.0.208: icmp_seq=2 ttl=64 time=0.557 ms
64 bytes from 10.0.0.208: icmp_seq=3 ttl=64 time=0.598 ms
例2:使用()
[root@CentOS8 testdir]#(ping 10.0.0.205&);(ping 10.0.0.208&);(ping 10.0.0.209&)
PING 10.0.0.205 (10.0.0.205) 56(84) bytes of data.
PING 10.0.0.208 (10.0.0.208) 56(84) bytes of data.
PING 10.0.0.209 (10.0.0.209) 56(84) bytes of data.
64 bytes from 10.0.0.205: icmp_seq=1 ttl=64 time=0.355 ms
[root@CentOS8 testdir]#64 bytes from 10.0.0.209: icmp_seq=1 ttl=64 time=0.289 ms
64 bytes from 10.0.0.208: icmp_seq=1 ttl=64 time=0.366 ms
64 bytes from 10.0.0.205: icmp_seq=2 ttl=64 time=0.528 ms
64 bytes from 10.0.0.209: icmp_seq=2 ttl=64 time=0.511 ms
64 bytes from 10.0.0.208: icmp_seq=2 ttl=64 time=0.589 ms
64 bytes from 10.0.0.205: icmp_seq=3 ttl=64 time=0.337 ms
64 bytes from 10.0.0.209: icmp_seq=3 ttl=64 time=0.627 ms
64 bytes from 10.0.0.208: icmp_seq=3 ttl=64 time=0.607 ms
例3:写在一起,建议使用空格隔开
[root@CentOS8 testdir]#ping 10.0.0.205& ping 10.0.0.208& ping 10.0.0.209&
[1] 570266
[2] 570267
[3] 570268
[root@CentOS8 testdir]#PING 10.0.0.205 (10.0.0.205) 56(84) bytes of data.
64 bytes from 10.0.0.205: icmp_seq=1 ttl=64 time=0.440 ms
PING 10.0.0.208 (10.0.0.208) 56(84) bytes of data.
64 bytes from 10.0.0.208: icmp_seq=1 ttl=64 time=0.364 ms
PING 10.0.0.209 (10.0.0.209) 56(84) bytes of data.
64 bytes from 10.0.0.209: icmp_seq=1 ttl=64 time=0.240 ms
64 bytes from 10.0.0.208: icmp_seq=2 ttl=64 time=0.382 ms
64 bytes from 10.0.0.205: icmp_seq=2 ttl=64 time=0.523 ms
64 bytes from 10.0.0.209: icmp_seq=2 ttl=64 time=0.308 ms
例4:使用{}分隔2组命令,先ping201和208两次,然后ping205和209
[root@CentOS8 ~]#{ ping -c2 10.0.0.201;ping 10.0.0.205; }& { ping -c2 10.0.0.208;ping 10.0.0.209; }&
[1] 572023
[2] 572024
[root@CentOS8 ~]#PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data.
PING 10.0.0.208 (10.0.0.208) 56(84) bytes of data.
64 bytes from 10.0.0.201: icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from 10.0.0.208: icmp_seq=1 ttl=64 time=0.384 ms
64 bytes from 10.0.0.201: icmp_seq=2 ttl=64 time=0.084 ms
--- 10.0.0.201 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1037ms
rtt min/avg/max/mdev = 0.025/0.054/0.084/0.030 ms
64 bytes from 10.0.0.208: icmp_seq=2 ttl=64 time=0.922 ms
--- 10.0.0.208 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1037ms
rtt min/avg/max/mdev = 0.384/0.653/0.922/0.269 ms
PING 10.0.0.205 (10.0.0.205) 56(84) bytes of data.
PING 10.0.0.209 (10.0.0.209) 56(84) bytes of data.
64 bytes from 10.0.0.209: icmp_seq=1 ttl=64 time=0.349 ms
64 bytes from 10.0.0.205: icmp_seq=1 ttl=64 time=0.381 ms
64 bytes from 10.0.0.209: icmp_seq=2 ttl=64 time=0.509 ms
64 bytes from 10.0.0.205: icmp_seq=2 ttl=64 time=0.552 ms
64 bytes from 10.0.0.209: icmp_seq=3 ttl=64 time=0.546 ms
64 bytes from 10.0.0.205: icmp_seq=3 ttl=64 time=0.530 ms
例:并行扫描网段
[root@CentOS8 testdir]#cat scanhost.sh
#!/bin/bash
NET=10.0.0
for i in {1..254};do
{
ping -c1 -w1 ${NET}.${i} &> /dev/null && echo ${NET}.${i} is up || echo ${NET}.${i} is down
}&
done
wait
[[root@CentOS8 testdir]#bash scanhost.sh
10.0.0.1 is up
10.0.0.2 is up
10.0.0.201 is up
10.0.0.208 is up
10.0.0.205 is up
10.0.0.209 is up
10.0.0.6 is down
10.0.0.3 is down
10.0.0.5 is down
10.0.0.7 is down
10.0.0.4 is down
10.0.0.12 is down
10.0.0.8 is down
....
3 任务计划
通过任务计划,可以让系统自动的按时间或周期性任务执行任务
未来的某时间点执行一次任务
at 指定时间点,执行一次性任务
batch 系统自行选择空闲时间去执行此处指定的任务
周期性运行某任务
cron
3.1 一次性任务
at 工具
- 由包 at 提供
- 依赖与atd服务,需要启动才能实现at任务
- at队列存放在/var/spool/at目录中
- 执行任务时PATH变量的值与当前定义任务的用户身份一致
at 命令
at [option] TIME
常用选项:
-V 显示版本信息
-t time 时间格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定队列中等待运行的作业;相当于atq
-d 删除指定的作业;相当于atrm
-c 查看具体作业任务
-f /path/file 指定的文件中读取任务
-m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
例:
[root@CentOS8 data]#at -l
1 Thu Aug 17 20:23:00 2023 a root
[root@CentOS8 data]#atrm 1
[root@CentOS8 data]#at -l
注意:
作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root
默认C8 最小化安装没有安装邮件服务,需要自行安装
例:
[root@CentOS8 data]#echo wall at jog | at 20:40
warning: commands will be executed using /bin/sh
job 6 at Wed Aug 16 20:40:00 2023
[root@CentOS8 data]#at -l
1 Thu Aug 17 20:23:00 2023 a root
6 Wed Aug 16 20:40:00 2023 a root
Broadcast message from root@CentOS8.Joyce.person1 (somewhere) (Wed Aug 16 20:40
at jog
^C
[root@CentOS8 data]#mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 6 messages 5 new
1 Joyce Sat Jul 1 18:55 32/1018 "help"
>N 2 root Wed Aug 16 20:44 15/504 "Output from your job 3"
N 3 root Wed Aug 16 20:44 15/504 "Output from your job 4"
N 4 root Wed Aug 16 20:44 14/601 "Output from your job 5"
N 5 root Wed Aug 16 20:44 14/555 "Output from your job 6"
N 6 root Wed Aug 16 20:44 14/498 "Output from your job 7"
& 6
Message 6:
From root@CentOS8.Joyce.person1 Wed Aug 16 20:44:35 2023
Return-Path: <root@CentOS8.Joyce.person1>
X-Original-To: root
Delivered-To: root@CentOS8.Joyce.person1
Subject: Output from your job 7
To: root@CentOS8.Joyce.person1
Date: Wed, 16 Aug 2023 20:44:00 +0800 (CST)
From: root <root@CentOS8.Joyce.person1>
Status: R
TIME:定义出什么时候进行at这项任务的时间
HH:MM [YYYY-mm-dd]
noon, midnight, teatime (4pm)
tomorrow
now+#{minutes ,hours , days ,OR weeks}
例:
[root@CentOS8 ~]#at -l
8 Wed Aug 16 20:58:00 2023 a root
[root@CentOS8 ~]#at now+10minutes
warning: commands will be executed using /bin/sh
at> echo ok
at> <EOT>
job 9 at Wed Aug 16 20:58:00 2023
[root@CentOS8 ~]#at -l
8 Wed Aug 16 20:58:00 2023 a root
9 Wed Aug 16 20:58:00 2023 a root
[root@CentOS8 ~]#atrm 9
[root@CentOS8 ~]#at -l
8 Wed Aug 16 20:58:00 2023 a root
[root@CentOS8 ~]#at -c 8 #查看文件内容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;05\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.dz=01\;31:\*.gz=01\;
例:时间格式
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20
HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes | hours |days | weeks] 在某个时间点再加几个时间后才进行该项任务
now + 5 min
02pm + 3 days
at任务执行方式:
交互式
输入重定向
at -f file
/etc/at.{allow,deny) 控制用户是否能执行at任务
- 白名单: /etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
- 黑名单: /etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行。但不影响用户之前创建的任务
- 如果两个文件都不存在,只有 root 可以执行 at 命令
- 如果同一个用户同时存在于黑白名单中,则仍可以执行任务,因为白名单优先级更高
3.2 周期性任务计划 cron
周期性任务计划cron相关的程序包:
- cronie: 主程序包,提供crond守护进程及相关辅助工具
- crontabs: 包含CentOS提供系统维护任务
- cronie-anacron: cronie的补充程序,用于监控cronie任务执行状况,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
cron 依赖于crond服务,确保crond服务处于运行状态:
#Centos 7 以后版本:
systemctl status crond
#Centos 6:
service crond status
cron任务分为
- 系统cron任务: 系统维护作业,/etc/crontab主配置文件,只有一个/etc/cron.d/子配置文件,里面保存各种计划任务
- 用户cron任务: 保存在 /var/spool/cron/USERNAME,利用 crontab 命令管理
计划任务日志: /var/log/cron****:跟踪日志****
[root@CentOS8 ~]#tail -f /var/log/cron
Aug 16 21:01:01 CentOS8 run-parts[684798]: (/etc/cron.hourly) finished 0anacron
Aug 16 22:01:01 CentOS8 CROND[706194]: (root) CMD (run-parts /etc/cron.hourly)
Aug 16 22:01:01 CentOS8 run-parts[706194]: (/etc/cron.hourly) starting 0anacron
Aug 16 22:01:01 CentOS8 run-parts[706194]: (/etc/cron.hourly) finished 0anacron
Aug 16 22:17:39 CentOS8 crontab[712165]: (root) BEGIN EDIT (root)
Aug 16 22:17:49 CentOS8 crontab[712165]: (root) END EDIT (root)
Aug 16 22:18:03 CentOS8 crontab[712306]: (root) BEGIN EDIT (root)
Aug 16 22:18:09 CentOS8 crontab[712306]: (root) END EDIT (root)
Aug 16 22:18:54 CentOS8 crontab[712614]: (root) BEGIN EDIT (root)
Aug 16 22:27:05 CentOS8 crontab[712614]: (root) END EDIT (root)
run-parts命令:
run-parts dir #将dir文件夹中的所有脚本执行
3.2.1 系统cron计划任务
/etc/crontab 格式说明,详情参见 man 5 crontab
注释行以 # 开头
[root@centos8 ~]#cat /etc/crontab
SHELL=/bin/bash #默认的SHELL类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin #默认的PATH变量值,可修改为其它路径
MAILTO=root #默认标准输出和错误发邮件给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
40 22 1-3 * 0 joyce echo hello
#每个月的1-3天的周日的22点40分,用joyce身份执行echo hello
#如有标准输出,以邮件发送
cron的几个文件:
[root@CentOS8 ~]#ll /etc/cron* -d
drwxr-xr-x. 2 root root 39 May 30 23:32 /etc/cron.d
drwxr-xr-x. 2 root root 23 May 30 23:30 /etc/cron.daily
-rw-r--r--. 1 root root 0 Nov 9 2019 /etc/cron.deny
drwxr-xr-x. 2 root root 22 May 30 23:30 /etc/cron.hourly
drwxr-xr-x. 2 root root 6 Jan 12 2021 /etc/cron.monthly
-rw-r--r--. 1 root root 451 Jan 12 2021 /etc/crontab
drwxr-xr-x. 2 root root 6 Jan 12 2021 /etc/cron.weekly
logrotate文件:
[root@CentOS8 ~]#ll /etc/cron.daily/
total 4
-rwxr-xr-x. 1 root root 189 Jan 4 2018 logrotate
logrotate :将每天未执行的任务在某时间后随即执行
计划任务时间表示法:
(1)特定值
给定时间点有效取值范围内的值
(2)*
给定时间点上有效取值范围内的所有值
表示“每...”
(3)离散取值
#,#,#
(4)连续取值
#-#
(5)在指定时间范围上,定义步长
/#: #即为步长
(6)特定关健字
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
@reboot Run once after reboot
crond任务相关文件:
/etc/crontab 配置文件
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/ 脚本
3.2.2 anacron
运行计算机关机时cron不运行的任务,C6以后版本取消anacron服务,由crond服务管理,对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要对很有用
由/etc/cron.hourly/0anacron执行,当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳
配置文件: /etc/anacrontab,负责执行/etc/ cron.daily/etc/cron.weekly/etc/cron.monthly中系统任务
/etc/anacrontab格式说明
- 字段1: 如果在这些日子里没有运行这些任务…
- 字段2: 在重新引导后等待这么多分钟后运行它
- 字段3: 任务识别器,在日志文件中标识
- 字段4:要执行的任务
3.2.3 管理临时文件
C 7 使用 systemd-tmpfiles-setup服务实现
C 6 使用/etc/cron.daily/tmpwatch定时清除临时文件
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令
systemd-tmpfiles -clean|remove create configfile
3.2.4 用户计划任务
crontab命令:
- 每个用户都有专用的cron任务文件: /var/spool/cron/USERNAME
- 默认标准输出和错误会被发邮件给对应的用户,如:wang创建的任务就发送至wang的邮箱
- root能够修改其它用户的作业
- 用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径在任务文件的第一行加PATH=/path
trontab命令格式
crontab [-u user] [-l | -r | -e] [-i]
常用选项:
-l 列出所有任务
-e 编辑任务,非root用户也可以创建任务
-r 移除所有任务
-i 同-r一同使用,以交互式模式移除指定任务
-u user 仅root可运行,指定用户管理cron任务
注意:当任务中同时存在日期和星期,则按照或者的关系执行,即都执行
[root@CentOS8 ~]#man 5 crontab
Note: The day of a command's execution can be specified in the following two fields —
'day of month', and 'day of week'. If both fields are restricted (i.e., do not contain
the "*" character), the command will be run when either field matches the current time.
For example,
"30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each
month, plus every Friday.
#如1号和5号,且周五,则是1号和5号以及每个周五都执行
注意:默认使用crontab命令会调用vi,内容无色,所以我们可以修改env.sh文件使其默认调用vim。而Ubuntu默认使用nano,我们可以修改为vim,同理:
[root@CentOS8 ~]#cat /etc/profile.d/env.sh
export EDITOR=vim
控制用户执行计划任务:
/etc/cron.{allow,deny)
面试题: 11月每天的6-12点之间每隔2小时执行/app/bin/test.sh
[root@CentOS8 ~]#crontab -e
0 6-12/2 * 11 * /app/bin/test.sh
# /2代表每2小时
#如果在开头的分钟这样写 20-30/5,则是20到30分每5分钟,即25分和30分
而使用-e选项创建的计划任务存在于
/var/spool/cron/
注意: 运行结果的标准输出和错误以邮件通知给相关用户
CMD > /dev/null
CMD &> /dev/null
cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将成当作命令的标准输入
如果在命令中要使用%,则需要用 \ 转义
注意:将%放置于单引号中是不支持的
注意:如果在计划里要执行命令,要写上系统的PATH=/…变量,因为它内部定义的PATH变量非常少,可能会造成找不到变量
例:使用计划任务和脚本实现磁盘报警(sed命令)
#脚本文件:
[root@CentOS8 scripts]#cat while_read_disk_check.sh
#!/bin/bash
WARNING=10
MAIL=1299575088@qq.com
df |sed -nr "/^\/dev\/sd/s#^([^ ]+) .* ([0-9]+)%.*#\1 \2#p" |while read DEVICE USE;do
if [ $USE -gt $WARNING ] ;then
echo "$DEVICE will be full,use:$USE" | mail -s "DISK WARNING" $MAIL
fi
done
#计划任务:
[root@CentOS8 scripts]#crontab -l
* * * * * /data/scripts/while_read_disk_check.sh
#跟踪日志:
[root@CentOS8 scripts]#tail -f /var/log/cron
Aug 16 22:18:09 CentOS8 crontab[712306]: (root) END EDIT (root)
Aug 16 22:18:54 CentOS8 crontab[712614]: (root) BEGIN EDIT (root)
Aug 16 22:27:05 CentOS8 crontab[712614]: (root) END EDIT (root)
Aug 16 22:46:25 CentOS8 crontab[722413]: (root) BEGIN EDIT (root)
Aug 16 22:50:01 CentOS8 CROND[723738]: (root) CMD (/data/scripts/while_read_disk_check.sh)
#邮件:
[root@CentOS8 scripts]#mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 10 messages 1 new 6 unread
1 Joyce Sat Jul 1 18:55 32/1018 "help"
U 2 root Wed Aug 16 20:44 16/514 "Output from your job 3"
U 3 root Wed Aug 16 20:44 16/514 "Output from your job 4"
U 4 root Wed Aug 16 20:44 15/611 "Output from your job 5"
U 5 root Wed Aug 16 20:44 15/565 "Output from your job 6"
6 root Wed Aug 16 20:44 15/509 "Output from your job 7"
7 root Wed Aug 16 20:58 15/516 "Output from your job 8"
8 (Cron Daemon) Wed Aug 16 22:47 28/1028 "Cron <root@CentOS8> /data/scripts/while_"
U 9 (Cron Daemon) Wed Aug 16 22:48 28/1027 "Cron <root@CentOS8> /data/scripts/while_"
>N 10 (Cron Daemon) Wed Aug 16 22:49 27/1017 "Cron <root@CentOS8> /data/scripts/while_"
& 10
(1) 如何在秒级别运行任务?
for min in 0 1 2; do echo "hi"; sleep 20; done
(2)如何实现每7分钟运行一次任务?
sleep命令:
sleep NUMBER[SUFFIX]..
SUFFIX:
s 秒,默认
m 分
h 小时
d 天
sleep 7m;echo hello
usleep:以微妙为单位;1000000即1秒
[root@CentOS8 scripts]#time usleep 5000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.005" instead...
real 0m0.013s
user 0m0.000s
sys 0m0.002s
[root@CentOS8 scripts]#time usleep 50000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.05" instead...
real 0m0.059s
user 0m0.000s
sys 0m0.001s
[root@CentOS8 scripts]#time usleep 50000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.05" instead...
real 0m0.066s
user 0m0.001s
sys 0m0.000s
[root@CentOS8 scripts]#time usleep 500000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.5" instead...
real 0m0.505s
user 0m0.000s
sys 0m0.002s
[root@CentOS8 scripts]#time usleep 500000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.5" instead...
real 0m0.506s
user 0m0.000s
sys 0m0.001s
[root@CentOS8 scripts]#mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
“/var/spool/mail/root”: 10 messages 1 new 6 unread
1 Joyce Sat Jul 1 18:55 32/1018 “help”
U 2 root Wed Aug 16 20:44 16/514 “Output from your job 3”
U 3 root Wed Aug 16 20:44 16/514 “Output from your job 4”
U 4 root Wed Aug 16 20:44 15/611 “Output from your job 5”
U 5 root Wed Aug 16 20:44 15/565 “Output from your job 6”
6 root Wed Aug 16 20:44 15/509 “Output from your job 7”
7 root Wed Aug 16 20:58 15/516 “Output from your job 8”
8 (Cron Daemon) Wed Aug 16 22:47 28/1028 “Cron root@CentOS8 /data/scripts/while_”
U 9 (Cron Daemon) Wed Aug 16 22:48 28/1027 “Cron root@CentOS8 /data/scripts/while_”
N 10 (Cron Daemon) Wed Aug 16 22:49 27/1017 “Cron root@CentOS8 /data/scripts/while_”
& 10
[外链图片转存中...(img-ZsTHYio8-1692200722596)]
(1) 如何在秒级别运行任务?
for min in 0 1 2; do echo “hi”; sleep 20; done
(2)如何实现每7分钟运行一次任务?
sleep命令:
```bash
sleep NUMBER[SUFFIX]..
SUFFIX:
s 秒,默认
m 分
h 小时
d 天
sleep 7m;echo hello
usleep:以微妙为单位;1000000即1秒
[root@CentOS8 scripts]#time usleep 5000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.005" instead...
real 0m0.013s
user 0m0.000s
sys 0m0.002s
[root@CentOS8 scripts]#time usleep 50000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.05" instead...
real 0m0.059s
user 0m0.000s
sys 0m0.001s
[root@CentOS8 scripts]#time usleep 50000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.05" instead...
real 0m0.066s
user 0m0.001s
sys 0m0.000s
[root@CentOS8 scripts]#time usleep 500000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.5" instead...
real 0m0.505s
user 0m0.000s
sys 0m0.002s
[root@CentOS8 scripts]#time usleep 500000
warning: usleep is deprecated, and will be removed in near future!
warning: use "sleep 0.5" instead...
real 0m0.506s
user 0m0.000s
sys 0m0.001s