系统管理查看一览

2022-09-28 19:41:49 浏览数 (1)

[TOC]

0x00 快速入门

主要是对系统资源进行操作管理显示的命令,在Linux中是非常重要的;

系统常用快捷键:

代码语言:javascript复制
ctrl c	停止执行 当前命令或者脚本
ctrl z	暂停执行 当前脚本或者任务
ctrl l	清屏
ctrl a	光标移动到命令行首
ctrl e	光标移动到命令行尾
`ctrl u	光标所在位置删除到行首`
`ctrl w  光标所在位置删除到行首`
`ctrl k  从光标处向后删除指令串`
ctrl d  删除光标后的字符 
ctrl r	在历史命令中搜索
ctrl t	将字符右移动
ctrl s	停止滚屏
ctrl q	恢复滚屏
ctrl p  上一条命令

Linux操作系统的核心kernel具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。 加载内核驱动的通常流程:

  • 1.先将.ko文件拷贝到/lib/module/uname -r(内核版本号)/kernel/driver/…目录下, 根据具体用途的区别分为net、ide、scsi、usb、video、parport、md、block、ata等等。
  • 2.运行depmod -a 更新模块依赖新主要是更新modules.dep文件
  • 3.运行modprobe加载内核模块
shutdown 命令 - 控制系统重启与关键

描述:使用该命令可以进设置行定时计算机重启和关机,还可以进行自定义关机消息或者发送警告信息;

语法和参数

代码语言:javascript复制
shutdown -t [秒] [选项] 时间 [警告信息]

# 参数说明
-t 加上秒数表示过几秒后关机
-k 不关机发送警告信息
-c 取消前一个关机或者重启命令(正在进行shutdown命令)
-h 系统服务停止后关机
-r 系统服务停止后重启
-n 不经过init程序直接运行shutdown关键功能
-f 开关机后略过fsck磁盘检查
-F 关机后强制进行fsck磁盘检查

实例演示:

代码语言:javascript复制
#示例1:使用date命令看系统日期,表示在凌晨5点30分重启,此时进入倒计时状态,无法再操作,通过ctrl c取消.
shutdown -r 05:30 #指定时间重启
shutdown -r now   #表示现在就重启
shutdown -h now   #表示现在就关闭系统
shutdown -h  30   #指三十分钟后关闭系统
#补充:在最后加上&,使命令在后台执行不占用操作界面,两次回车后继续自己的操作,此时如果不想在后台执行这条命令,可以用shutdown -c来取消

# 实例2.十分钟后关机并提示信息
shutdown -h 10 'I will shutdown after 10 mins'

# 实例3.仅仅发送警告信息给在线用户而不会关机
shutdown -k now 'Dangers will current users login'

补充说明:

1.shutdown命令的优点是依据目前已启动的服务逐次关闭各服务后关机;

2.建议执行下面的命令前执行sync命令

代码语言:javascript复制
# 1) 其他关机命令:但这三者都不太安全
halt : 不理会目前系统状态下进行硬件关键的特殊功能;
poweroff
init 0

# 2) 其他重启命令:
reboot #比较安全
init 6 #不安全(可能导致数据丢失)
init 命令

描述:init命令主要是向init守护进程发送控制命令。

代码语言:javascript复制
init  <表示调用某个级别|COMMAND>

#代表系统运行的七个级别:
0 关机
1 单用户,可以看做win中的安全模式,用来做系统修复
2 不完全多用户,不含NFS服务(文件共享服务)
3 完全多用户(就是黑底白字的字符界面)
4 未分配
5 图形界面
6 重启

其他参数:
1, s, S        Enter rescue mode  #进入救援模式(安全模式)
q, Q           Reload init daemon configuration #重新加载init守护进程配置
u, U           Reexecute init daemon  # 重新执行init守护进程

实例演示:

代码语言:javascript复制
#示例1.使用runlevel来看系统到底运行在哪个级别,Mac OS不支持,并且改变系统开机默认级别
runlevel
# N 3
systemctl get-default   #获取当前运行等级
# multi-user.target


#示例2.设置系统开机级别
cat /etc/inittab #修改的配置文件,以Debian和CentOS7为例
#Centos 6的配置:找到文件中的id:3:initdefault字段,修改数字,改变系统开机默认级别
multi-user.target  #类似  level 3
graphical.target   #类似  level 5
systemctl get-default   ##当前运行等级 || 上面那种也可以
systemctl set-dafault multi-user.target   #设置默认为字符界面

非常注意: 在/etc/inittab中绝对不能设为0和6,会导致不断重启;

logout 命令

描述:主要是退出shell终端,相当于windows下的logoff;

lsb_release 命令

描述:查看打印当前linux系统的发行版本(Centos默认没有没有,但是Debian得还有)

代码语言:javascript复制
# 示例1.系统信息查看
$ lsb_release -a
Distributor ID: Kali
Description:    Kali GNU/Linux Rolling
Release:        2019.2
Codename:       n/a

# 实例2.发行版信息查看
$ lsb_release 
focal

# 示例3.其他几种查看系统信息命令
$cat /etc/system-release
CentOS Linux release 7.7.1908 (Core)
$cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
uname 命令

描述:查看系统与内核相关信息

代码语言:javascript复制
uname [选项]

WeiyiGeek.uname参数

示例案例:

代码语言:javascript复制
# (1) 系统版本及其内核信息
uname -a
  # Linux localhost.localdomain 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
# - 文件方式查看系统类型
cat /proc/version
  # Linux version 5.4.0-74-generic (buildd@lgw01-amd64-038) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #83-Ubuntu SMP Sat May 8 02:35:39 UTC 2021

# (2) 其他参数效果
$uname -r
3.10.0-957.12.2.el7.x86_64
$uname -n
localhost.localdomain
$uname -p
x86_64
$uname -o
GNU/Linux
$uname -r
3.10.0-957.12.2.el7.x86_64
$uname -s
Linux
$uname -m
x86_64
dmesg 命令

描述:开机时内核检测信息-硬件信息,dmesg命令被用于检查和控制内核的环形缓冲区,kernel会将开机信息存储在ring buffer中 您若是开机时来不及查看信息,可利用dmesg来查看,开机信息保存文件; 当有硬盘坏道时,通常在dmesg输出的信息中会有 Buffer I/O Error,所以经常检查dmesg的输出可以及时发现是否存在硬盘问题。

代码语言:javascript复制
#选项语法
dmesg [选项]
选项:
 -C, --clear                 清除内核环形缓冲区(ring butter)
 -c, --read-clear            读取并清除所有消息
 -D, --console-off           禁止向终端打印消息
 -d, --show-delta            显示打印消息之间的时间差
 -e, --reltime               以易读格式显示本地时间和时间差
 -E, --console-on            启用向终端打印消息
 -F, --file <文件>           用 文件 代替内核日志缓冲区
 -f, --facility <列表>       将输出限制为定义的设施
 -H, --human                 易读格式输出
 -k, --kernel                显示内核消息
 -L, --color                 显示彩色消息
 -l, --level <列表>          限制输出级别
 -n, --console-level <级别>  设置打印到终端的消息级别
 -P, --nopager               不将输出通过管道传递给分页程序
 -r, --raw                   打印原生消息缓冲区
 -S, --syslog                强制使用 syslog(2) 而非 /dev/kmsg
 -s, --buffer-size <大小>    查询内核环形缓冲区所用的<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小
 -T, --ctime                 显示易读的时间戳(如果您使用了
                                SUSPEND/RESUME 则可能不准)
 -t, --notime                不打印消息时间戳
 -u, --userspace             显示用户空间消息
 -w, --follow                等待新消息
 -x, --decode                将设施和级别解码为可读的字符串

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

支持的日志设施:
    kern - 内核消息
    user - 随机的用户级消息
    mail - 邮件系统
  daemon - 系统守护进程
    auth - 安全/认证消息
  syslog - syslogd 内部生成的消息
     lpr - 行打印机子系统
    news - 网络新闻子系统

支持的日志级别(优先级):
   emerg - 系统无法使用
   alert - 操作必须立即执行
    crit - 紧急条件
     err - 错误条件
    warn - 警告条件
  notice - 正常但重要的条件
    info - 信息
   debug - 调试级别的消息

# cat /var/log/dmesg | grep "CPU"
/var/log/dmesg

实际案例:

代码语言:javascript复制
#示例1.信息查看
dmesg | grep CPU
dmesg | grep "Linux version" 
dmesg | head
[    0.000000] Linux version 3.10.0-957.12.2.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Tue May 14 21:24:32 UTC 2019
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-957.12.2.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8

#其他方式查看CPU信息
cat /proc/cpuinfo

#示例2.清除dmesg信息
dmesg -c
dmesg -C
lscpu 命令 - 显示CPU信息实际是美化显示cpuinfo中的内容

描述:查看系统的CPU信息和cat /proc/cpuinfo 输出结果类似。相当于 Linux 下的 CPU-Z

使用帮助:

代码语言:javascript复制
man 1 lscpu
#参数
-e,——extended[=<list>]打印出扩展的可读格式
-p,——parse[=<list>]打印出可解析格式

#list Available columns:(使用时候小写)
           CPU  logical CPU number
          CORE  logical core number
        SOCKET  logical socket number
          NODE  logical NUMA node number
          BOOK  logical book number
        DRAWER  logical drawer number
         CACHE  shows how caches are shared between CPUs
  POLARIZATION  CPU dispatching mode on virtual hardware
       ADDRESS  physical address of a CPU
    CONFIGURED  shows if the hypervisor has allocated the CPU
        ONLINE  shows if Linux currently makes use of the CPU
        MAXMHZ  shows the maximum MHz of the CPU
        MINMHZ  shows the minimum MHz of the CPU

实际案例:

代码语言:javascript复制
#示例1.查看CPU信息
$lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian #小端|低位优先
CPU(s):                4   #CPU物理个数
On-line CPU(s) list:   0-3 #CPU逻辑个数
Thread(s) per core:    1   #线程数:每个core有1个threads
Core(s) per socket:    1   #核心数:每个socket有1个cores
Socket(s):             4   #4个sockets
NUMA node(s):          1
Vendor ID:             GenuineIntel #供应商代码
CPU family:            6    #处理器系列 6 代
Model:                 85   #处理器模型 (0x55)
Model name:            Intel Xeon Processor (Skylake, IBRS) #处理器名称
Stepping:              4 #分级鉴别产品数据转换规范,“步进”编号用来标识一系列CPU的设计或生产制造版本数据,标识CPU不同的“修订”;
CPU MHz:               2294.614  #处理器主频
BogoMIPS:              4589.22   #CPU性能测试参数(Bogo是Bogus(伪)的意思;MIPS是每秒百万条指令)
Hypervisor vendor:     KVM  #管理供应商
Virtualization type:   full #虚拟化类型
L1d cache:             32K  #1-3级缓存
L1i cache:             32K  #冯诺依曼 哈弗体系结构
L2 cache:              4096K
L3 cache:              16384K
NUMA node0 CPU(s):     0-3 #解决core分组的问题 
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat pku ospke spec_ctrl intel_stibp
#threads数计算:4(sockets)×1(node)×1(cores)×1(threads) = 4核4线程


#示例2.查询指定CPU扩展信息
$lscpu -a -e=cpu,node,book,core,cache,address,drawer
CPU NODE BOOK CORE L1d:L1i:L2:L3 ADDRESS DRAWER
0   0    -    0    0:0:0:0       -


#示例3.格式化查询信息
$lscpu -p=cpu,node,cache
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Node,L1d:L1i:L2:L3
0,0,0:0:0:0

文件 /proc/cpuinfo 信息说明:

代码语言:javascript复制
$ cat /proc/cpuinfo
processor       : 0   #处理器序号
vendor_id       : GenuineIntel #处理器生产厂家
cpu family      : 6  #CPU产品系列代号
model           : 85 #CPU属于其系列中的哪一代的代号
model name      : Intel Xeon Processor (Skylake, IBRS) #CPU属于的名字及其编号、标称主频
stepping        : 4 #修订版本
microcode       : 0x1
cpu MHz         : 2294.614  #主频
cache size      : 16384 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat pku ospke spec_ctrl intel_stibp
bogomips        : 4589.22 #CPU性能值
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:  #电源管理

补充知识: /etc/cpuinfo 参数说明

1.CPU ID:CPU生产厂家为识别不同类型的CPU,而为CPU制订的不同的单一的代码;其CPU ID定义也是不同的;如 “0F24”(Inter处理器)、“681H”(AMD处理器)

Inter处理器的CPU ID是以十六进制表示的:如“0F24”,从左至右分别表示 Type(类型)、Family(系列)、Mode(型号)和Stepping(步进编号)以及新增Brand ID(品种标识)

AMD处理器一般分为三位,如“681”,从左至右分别表示为Family(系列)、Mode(型号)和 Stepping(步进编号).

代码语言:javascript复制
Type(类型):类型标识用来区别INTEL微处理器是用于由最终用户安装,还是由专业个人计算机系 统集成商、服务公司或制作商安装;
  - 1.数字“1”标识所测试的微处理器是用于由用户安装的(通常)
  - 2.数字“0”标识所测试的微处理器是用于由专业个人计算机系统集成 商、服务公司或制作商安装的;

Family(系列):系列标识可用来确定处理器属于那一代产品;
  - 1.如6系列的INTEL处理器包括Pentium Pro、Pentium II、Pentium II Xeon、Pentium III和Pentium III Xeon处理器,5系列(第五代)包括Pentium处理器和采用 MMX技术的Pentium处理器
  - 2.AMD的6系列实际指有K7系列CPU,有DURON和ATHION两大类

Mode(型号):确定处理器的制作技术以及属于该系列的第几代设计(或核心),型号与系列通常是相互配合使用的,用于确定计算机所安装的处理器是属于某系列处理器的哪种特 定类型
  - 1.如可确定Celerom处理器是Coppermine还是Tualutin核心
  - 2.Athlon XP处理器是Paiomino还是 Thorouhgbred核心

Stepping(步进编号):步进编号用来标识处理器的设计或制作版本,有助于控制和跟踪处理器的更 改,步进还可以让最终用户更具体地识别其系统安装的处理器版本,确定微处理器的内部设计或制作特性
  - 1.步进编号和核心步进是密切联系的,步进编号就好比处理器的小版本号如CPUID为 “686”和“686A”就好比WINZIP8.0和8.1的关系

Brand ID(品种标识)
  - INTEL从Coppermine核心的处理器开始引入Brand ID作为CPU的辅助识别手段。

2.vendor_id(CPU制造商ID):Intel处理器的vendor字符串为“GenuineIntel”

代码语言:javascript复制
CYRIX:CyrixInstead
AMD:AuthenticAMD
UMC:UMC UMC UMC
NEXGEN:NexGenDriven
CENTAUR:CentaurHauls
RISE:RiseRiseRise
TRANSMETA:GenuineTMx86
TRANSMETA:TransmetaCPU
NSC:Geode by NSC
SiS:SiS SiS SiS

3.cpu family:CPU产品系列代号,6系列(第六代)包括众多处理器,如Celeron,Pentium 2,Pentium 3,Core i5&i7,Atom系列(E3000t系列、Z3600系列、C2000系列等等)

代码语言:javascript复制
“1”表示为8086和80186级芯片;
“2”表示为286级芯片;
“3”表示为386级芯片; 
“4”表示为486级芯片(SX、DX、:DX2、DX4); 
“5”表示为P5级芯片(Pentium处理器和含MMX技术的Pentium处理器);
“6”表示为P6级芯片(包括Celeron、Pentium II、PenfiumIII系列); 
“F”代表Xeon处理器、Pentium 4处理器。

4.CPU属于的名字及其编号、标称主频

5.model name:CPU属于的名字及其编号、标称主频

6.stepping:CPU属于制作更新版本

lsmem

描述:查看系统内存的信息,使用与lscpu差不多

实际案例:

代码语言:javascript复制
#示例1.查看内存信息
$lsmem
RANGE                                 SIZE  STATE REMOVABLE BLOCK
0x0000000000000000-0x000000007fffffff   2G online        no  0-15

Memory block size:       128M
Total online memory:       2G
Total offline memory:      0B

#示例2.输出指定的要查询的内存列
lsmem -o STATE,SIZE,ZONES,BLOCK
 STATE SIZE ZONES BLOCK
online   2G     -  0-15

Memory block size:       128M
Total online memory:       2G
Total offline memory:      0B
0x01 系统性能查看
vmstat 命令

描述:显示虚拟内存状态(“Virtual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

代码语言:javascript复制
# vmstat [刷新延时 刷新次数]
#参数:
- 时间间隔:状态信息刷新的时间间隔
- 次数:显示报告次数

WeiyiGeek.

实际案例:

代码语言:javascript复制
#示例1.显示系统信息并刷新三次
$vmstat 1 3
#显示的数据与TOP差不多
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 1392956   3140 368760    0    0     4     2   21   29  0  0 100  0  0
 0  0      0 1392956   3140 368760    0    0     0     0  193  134  0  0 100  0  0
 0  0      0 1392988   3140 368756    0    0     0     0   33   34  0  0 100  0  0

# st[(Steal time)虚拟时间百分比]

WeiyiGeek.数据说明

WeiyiGeek.SWAP/IO

WeiyiGeek.SYSTEM.CPU

free 命令 - 列出系统当前内存与swap使用情况

描述:free命令查看内存使用状态,也能查看swap分区启用状况

系统使用的内存与应用使用内存得区别: Buffer(缓冲区) – 加速写入 – (缓存于主要项,Inddle等文件夹块) Cached(缓存区) – 加速读取 – (缓存主要用于打开的文件)

代码语言:javascript复制
#基础语法
free [-b|-k|-m|-g]

WeiyiGeek.free参数

案例示例:

代码语言:javascript复制
#示例1.以mb显示空间剩余
free -m
              total        used        free      shared  buff/cache   available
Mem:           1838         115        1360           8         363        1556
Swap:          2047           0        2047

#第一行:total时内存数,used是已经使用的内存数,free是空闲的内存数,shared是多个进程共享的内存总数,缓冲/缓冲,可以利用的内存树.
关系:total = used   free
系统使用内存 = Total - Free
应用使用内存 = Total -(Free Cache Buffer)

#第二部分(-/  buffers/cache)解释:
(-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached
( buffers/cache) free内存数: 第一部分Mem行中的 free   buffers   cached
#可见-buffers/cache反映的是被程序实实在在吃掉的内存,而 buffers/cache反映的是可以挪用的内存总数

#第三行:total是swap的总数;used是已经使用的swap数,free是空闲的swap数,默认单位KB这里是MB

系统使用的内存、应用使用的内存计算:

代码语言:javascript复制
$awk '/MemTotal/{total=$2} /MemFree/{free=$2}END{print (total-free)/1024i "MB"}' /proc/meminfo 
576.105MB

awk '/MemTotal/{total=$2} /MemFree/{free=$2} /^Cached/{cached=$2} /Buffers/{buffers=$2} END{ print (total-free-cached-buffers)/1024 "MB"}' /proc/meminfo
382.781MB
#注意这里的Cached需要用正则,因为有重复包含Cached的一

WeiyiGeek.内存技术

uptime 命令

描述:uptime命令能够显示系统的启动时间和平均负载,也就是top命令的第一行w命令也可以看这个数据;

Linux中CPU相关信息说明(重点逻辑cpu个数和物理cpu个数):

代码语言:javascript复制
公式:逻辑CPU个数=物理CPU个数 * 每颗物理CPU的核数 * 超线程数
# 1.物理CPU个数
cat /proc/cpuinfo| grep "physical id" | sort | uniq | wc -l
# 2.查询CPU核心数
cat /proc/cpuinfo| grep "cpu cores" | uniq
# 3.逻辑CPU线程 (常用表述) 
grep -c 'processor' /proc/cpuinfo

# CPU型号的查询以及物理CPU和逻辑CPU数目
grep name /proc/cpuinfo | cut -f2 -d: | uniq -c
# 128  Intel(R) Xeon(R) Gold 6130 CPU @ 2.10GHz
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l   # 物理 # 4
cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l       # 核心 # 16 
cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l     # 线程 # 128
# 由上可知是 4颗物理CPU, 16核128线程

那这几个概念区别是什么?

  • 1.CPU:独立的中央处理单元,体现在主板上是有多个CPU的槽位。
  • 2.CPU cores:在每一个CPU上都可能有多个核(core),每一个核中都有独立的一套ALU、FPU、Cache等组件,所以这个概念也被称作物理核。
  • 3.processor:这个主要得益于超线程技术可以让一个物理核模拟出多个逻辑核即processor,我们常说几核就是说得它;

简单来说就是,当有多个计算任务时,可以让其中一个计算任务使用ALU的时候另一个则去使用FPU。这样就可以充分利用物理核中的各个部件,使得同一个物理核中也可以并行处理多个计算任务。 理论上来说,对于计算密集型的任务,线程数应该和CPU所能提供的并行数一致,补充一下AMDcpu并行执行效率和性能高于Intel处理器,并且AMD为发烧友提供了一定得超频空间;

那这里的“并行数”应该采取物理核数还是processor数呢? 描述:从下面可以看到线程数超过processor数量(48)或者小于物理核数量(24),吞吐量都会收到较大影响

WeiyiGeek.

那么什么是系统平均负载呢? 答:系统平均负载是指在特定时间间隔内运行队列中的平均进程数, 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。 举个例子:如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题, 如果你的linux主机是1个双核CPU * 3 = Load Average 为6的时候说明机器已经被充分使用了。

案例演示:

代码语言:javascript复制
$uptime
10:23:42 up 19:37,  1 user,  load average: 0.00, 0.01, 0.05 #注意单核CPU一般不要超过5
#uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。

$w
10:23:45 up 19:37,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.10.107.112    08:53    1.00s  0.15s  0.00s w

WeiyiGeek.uptime说明

top 命令

描述:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具,通过top命令所提供的互动式界面,用热键可以管理

基础语法:

代码语言:javascript复制
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
- 缓冲(buffer):加速数据的写入write
- 缓存(cached):加快数据的读取read


-b:以批处理模式操作;
-c:显示完整的治命令;
-d <时间>:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i:使top不显示任何闲置或者僵死进程。
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。
-H: 查看进程的子线程信息


#top交互命令
#如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。
h:显示帮助画面,给出一些简短的命令总结说明;
k:终止一个进程;
i:忽略闲置和僵死进程,这是一个开关式命令;
q:退出程序;
r:重新安排一个进程的优先级别;
S:切换到累计模式;
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
f或者F:从当前显示中添加或者删除项目;
o或者O:改变显示项目的顺序;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
M:根据驻留内存大小进行排序;
P:根据CPU使用百分比大小进行排序;
T:根据时间/累计时间进行排序;
W: 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

实际案例:

代码语言:javascript复制
#实际输出值解释:
$top
# top - 15:21:39 up 1 day,  4:45,  1 user,  load average: 0.00, 0.01, 0.05
# Tasks: 159 total,   1 running, 158 sleeping,   0 stopped,   0 zombie
# %Cpu(s):  6.2 us,  0.0 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# KiB Mem :  1882620 total,  1399708 free,   124212 used,   358700 buff/cache
# KiB Swap:  2097148 total,  2097148 free,        0 used.  1584276 avail Mem

#   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME  COMMAND
#     1 root      20   0  125436   3952   2608 S  0.0  0.2   0:01.82 systemd
  1. 第一排: top - 09:44:56[当前系统时间],16 days[系统已经运行了16天],1 user[个用户当前登录],load average: 9.59, 4.75, 1.92[系统负载,即任务队列的平均长度]
  • 1分前平均负载 5分前平均负载 15分前平均负载:平均负载指的是15分钟内内存和CPU占比的平均值这个值多大算好
  • 应该按CPU的核数来判断,如果是2核这个数不应该大于2,如果是4核不应该大于4,如果大于4其他指标都正常这个值也没问题;
  1. 第二排: Tasks: 145 total[总进程数],2 running[正在运行的进程数],143 sleeping[睡眠的进程数],0 stopped[停止的进程数],0 zombie[冻结/僵尸进程数]
  2. 第三排: Cpu(s): 6.2%us[用户空间占用CPU百分比], 通常用户态 CPU 高表示有应用程序比较繁忙; 0.1%sy[内核空间占用CPU百分比], 通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈 0.0%ni[用户进程空间内改变过优先级的进程占用CPU百分比],nice 是一个进程优先级的修正值,如果进程通过它修改了优先级,则会单独统计 CPU 开销 0.2%id[空闲CPU百分比], 此时CPU 会执行一个特定的虚拟进程,名为 System Idle Process。 0.0%wa[等待I/O操作完成所花费的时间],通常该指标越低越好,否则表示 I/O 存在瓶颈,可以用 iostat 等命令做进一步分析。 0.0%hi[硬hard中断请求服务占用百分比],硬中断是由外设硬件(如键盘控制器、硬件传感器等)发出的,需要有中断控制器参与,特点是快速执行。 0.0%si[软soft中断请求服务占用百分比],软中断是由软件程序(如网络收发、定时调度等)发出的中断信号,特点是延迟执行。 0.0%st[(Steal time)被虚拟占用时间百分比],仅出现在多虚拟机场景,如果该指标过高,可以检查下宿主机或其他虚拟机是否异常。
  3. 第四排:单位KB Mem: 4147888k total[物理physical内存总量], 2493092k used[使用的物理内存总量], 1654796k free[空闲内存总量], 158188k buffers[用作内核缓冲的内存量]
  4. 第五排: Swap:5144568k total[交换区总量], 56k used[使用的交换区总量], 5144512k free[空闲内存总量], 2013180k cached[缓存的交换区总量];内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
  5. 第六排:进程信息区 PID:进程id PPID:父进程id RUSER:Real user name(看了好多,都是这样写,也不知道和user有什么区别,欢迎补充此处) UID:进程所有者的id USER:进程所有者的用户名 GROUP:进程所有者的组名 TTY:启动进程的终端名。不是从终端启动的进程则显示为? PR:优先级 NI:nice值负值表示高优先级,正值表示低优先级 P:最后使用的CPU,仅在多CPU环境下有意义 %CPU:上次更新到现在的CPU时间占用百分比 TIME:进程使用的CPU时间总计,单位秒 TIME :进程所使用的CPU时间总计,单位1/100秒 %MEM:进程使用的物理内存百分比 VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP RES SWAP:进程使用的虚拟内存中被被换出的大小 RES:进程使用的、未被换出的物理内存的大小 CODE:可执行代码占用的物理内存大小 DATA:可执行代码以外的部分(数据段 栈)占用的物理内存大小 SHR:共享内存大小 nFLT:页面错误次数 nDRT:最后一次写入到现在,被修改过的页面数 S:进程状态:D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程 COMMAND:命令名/行 WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名 Flags:任务标志

基础实例:

代码语言:javascript复制
#示例1.进入执行top命令然后按1即可显示每个CPU使用及其负载情况;
PS:这里看到的CPU0~CPUn数量其实是processor数即逻辑CPU。
top
# top - 23:04:20 up 1 day,  7:01,  1 user,  load average: 0.00, 0.01, 0.05
# Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   0 zombie
# %Cpu0  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu1  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
# %Cpu3  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st


#示例2.输出top信息到文件批处理方式
$top -b -n 1
$top -d 5  #刷新间隔

#示例3.TOP中交互参数的使用 (注意大小写)
N:以PID排序(从大到小)
k:终止进程
m:内存信息
t:cpu信息
KiB Mem : 16.2/1882620  [     ]
KiB Swap:  0.0/2097148  [     ]

#示例4.利用top命令查看优先级:
NI      进程优先级-数值越大,占用CPU时间越少.
 ---<   高优先级
 ---N   低优先级
 ---L   有些页被锁进内存
 ---s   包含子进程
 ---    位于后台的进程组;
 ---l   多线程,克隆线程  multi-threaded (using CLONE_THREAD, likeNPTL pthreads do)

#实例5.显示子进程
$top -Hp 8607
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME  COMMAND
8608 root      20   0  114692  23364   6356 S  0.3  0.6   1:36.69 frps
8607 root      20   0  114692  23364   6356 S  0.0  0.6   0:14.23 frps
8609 root      20   0  114692  23364   6356 S  0.0  0.6   0:48.21 frps
8610 root      20   0  114692  23364   6356 S  0.0  0.6   0:47.08 frps

补充:如何正确理解 CPU 使用率和平均负载的关系? 简述:CPU(Central Processing Unit)是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元,相当于系统的“大脑”

什么是CPU 的物理核与逻辑核?

一台机器可能包含多块 CPU 芯片之间通过系统总线通信,而一块 CPU 芯片可能包含多个物理核,每个物理核都是一个实打实的运算核心(包括运算器、存储器等)。

衍生知识超线程(Hyper-Threading)

该技术可以让一个物理核在单位时间内同时处理两个线程,变成两个逻辑核。但它不会拥有传统单核 2 倍的处理能力,也不可能提供完整的并行处理能力。

举个例子,假设一个 CPU 芯片就是一个班级;它有 2 个物理核,也就是 2 个同学,老师让他们分别担任班长和体育委员;过了一段时间,校长要求每个班级还要有学习委员和生活委员,理论上还需要 2 位同学,但是这个班级只有 2 个人,最后老师只能让班长和体育委员兼任。 这样一来,对于不了解的人来说,这个班级有班长、体育委员、学习委员和生活委员 4 个职位,应该有 4 个人,每个职位就是一个逻辑核;但是,实际上这个班级只有 2 位同学,也就是只有 2 个物理核,虽然他们可以做 4 份工作,但是不能把他们当做 4 个人。

WeiyiGeek.Hyper-Threading实例

如何查询 CPU 信息?

代码语言:javascript复制
#查看 CPU 个数:
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l
#查看 CPU 物理核数:
cat /proc/cpuinfo | grep 'cpu cores' | sort | uniq
#查看 CPU 逻辑核数:
cat /proc/cpuinfo | grep 'siblings' | sort | uniq

什么是 CPU 使用率? 描述:CPU 使用率就是 CPU 非空闲态运行的时间占比,它反映了 CPU 的繁忙程度;

比如单核 CPU 1s 内非空闲态运行时间为 0.8s,那么它的 CPU 使用率就是 80%; 比如双核 CPU 1s 内非空闲态运行时间分别为 0.4s 和 0.6s,那么总体 CPU 使用率就是 (0.4s 0.6s) / (1s * 2) = 50%,其中 2 表示 CPU 核数,多核 CPU 同理。

使用 top 查看 CPU 使用情况:

代码语言:javascript复制
#参数解释看前面
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

由于 CPU 有多种非空闲态,因此 CPU 使用率计算公式可以总结为:CPU 使用率 = (1 - 空闲态运行时间/总运行时间) * 100%;根据经验法则建议生产系统的 CPU 总使用率不要超过 70%,但是注意与核心数有关。

代码语言:javascript复制
(1 - 99.9%) * 100% = 0.1%

什么是平均负载? 描述:平均负载(Load Average)是指单位时间内,系统处于 可运行状态(Running / Runnable) 和 不可中断态 的平均进程数,也就是平均活跃进程数。

可运行状态:正在使用 CPU 或者等待 CPU 的进程; 不可中断态:是指处于内核态关键流程中的进程,并且该流程不可被打断;本质上是系统对进程和硬件设备的一种保护机制。

比如:当进程向磁盘写数据时,如果被打断,就可能出现磁盘数据与进程数据不一致。

使用 top 命令查看平均负载该值越小,表示系统工作量越少,负荷越低;反之负荷越高。

代码语言:javascript复制
#表示 1分钟、5分钟、15分钟内系统的平均负载
load average: 0.00, 0.01, 0.05

理想情况下每个 CPU 应该满负荷工作,并且没有等待进程,此时平均负载 = CPU 逻辑核数。但是在实际生产系统中,不建议系统满负荷运行。 通用的经验法则是:平均负载 = 0.7 * CPU 逻辑核数,此处以单核CPU为例。

  • 当平均负载持续大于 0.7 * CPU 逻辑核数,就需要开始调查原因,防止系统恶化;
  • 当平均负载持续大于 1.0 * CPU 逻辑核数,必须寻找解决办法,降低平均负载;
  • 当平均负载持续大于 5.0 * CPU 逻辑核数,表明系统已出现严重问题,长时间未响应,或者接近死机。

平均负载的变化趋势两层含义: 一是 load1、load5、load15 之间的变化趋势, 二是历史的变化趋势;

  • 当 load1、load5、load15 三个值非常接近,表明短期内系统负载比较平稳。此时,应该将其与昨天或上周同时段的历史负载进行比对,观察是否有显著上升
  • 当 load1 远小于 load5 或 load15 时,表明系统最近 1 分钟的负载在降低,而过去 5 分钟或 15 分钟的平均负载却很高
  • 当 load1 远大于 load5 或 load15 时,表明系统负载在急剧升高,如果不是临时性抖动,而是持续升高,特别是当 load5 都已超过 0.7 * CPU 逻辑核数时,应调查原因,降低系统负载

CPU 使用率与平均负载的关系总结

1.CPU 使用率是单位时间内 CPU 繁忙程度的统计 2.平均负载不仅包括正在使用 CPU 的进程,还包括等待 CPU 或 I/O 的进程

因此,两者不能等同,有两种常见的场景如下所述:

  • CPU 密集型应用,大量进程在等待或使用 CPU,此时 CPU 使用率与平均负载呈正相关状态。
  • I/O 密集型应用,大量进程在等待 I/O,此时平均负载会升高,但 CPU 使用率不一定很高。

例子:假设现在有一个电话亭,有 4 个人在等待打电话,电话亭同一时刻只能容纳 1 个人打电话,只有拿起电话筒才算是真正使用。 那么 CPU 使用率就是拿起电话筒的时间占比,它只取决于在电话亭里的人的行为,与平均负载没有非常直接的关系。而平均负载是指在电话亭里的人加上排队的总人数,如下图所示:

WeiyiGeek.

htop 命令

描述:htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses。 与Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。 优点:

  • 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
  • 在启动上,比top 更快。
  • 杀进程时不需要输入进程号。
  • htop 支持鼠标操作。
  • top 已经很老了。

htop 官网:http://htop.sourceforge.net/

htop安装:

代码语言:javascript复制
#Centos Yum安装
yum install -y htop

#Debian/Ubuntu 自带htop

htop语法和参数:

代码语言:javascript复制
#命令行
-d --delay=DELAY     设置延迟更新时间,单位秒
-h --help           显示htop 命令帮助信息
-u --user=USERNAME    只显示一个给定的用户的过程
-p --pid=PID,PID…       只显示给定的PIDs
-s --sort-key COLUMN     依此列来排序
-v –version          显示版本信息


#交互式
Shortcut Key 	Function Key 	Description 	中文说明
h, ? 	F1 	Invoke htop Help 	查看htop使用说明
S 	F2 	Htop Setup Menu 	htop 设定
/ 	F3 	Search for a Process 	搜索进程  #常用
 	F4 	Incremental process filtering 	增量进程过滤器 #常用
t 	F5 	Tree View 	显示树形结构 #常用
<, > 	F6 	Sort by a column 	选择排序方式
[ 	F7 	Nice - (change priority) 	可减少nice值,这样就可以提高对应进程的优先级
] 	F8 	Nice   (change priority) 	可增加nice值,这样就可以降低对应进程的优先级
k 	F9 	Kill a Process 	可对进程传递信号
q 	F10 	Quit htop 	结束htop
上下键或PgUP, PgDn #选定想要的进程,左右键或Home, End 移动字段,当然也可以直接用鼠标选定进程;
Space    标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程
U    取消标记所有进程
s    选择某一进程,按s:用strace追踪进程的系统调用
l    显示进程打开的文件: 如果安装了lsof,按此键可以显示进程所打开的文件
I    倒转排序顺序,如果排序是正序的,则反转成倒序的,反之亦然
 , -    When in tree view mode, expand or collapse subtree. When a subtree is collapsed a " " sign shows to the left of the process name.
a (在有多处理器的机器上)    设置 CPU affinity: 标记一个进程允许使用哪些CPU
u    显示特定用户进程
M    按Memory 使用排序
P    按CPU 使用排序
T    按Time  使用排序
F    跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。这对监视一个进程非常有用:通过这种方式,你可以让一个进程在屏幕上一直可见。使用方向键会停止该功能。
K    显示/隐藏内核线程
H    显示/隐藏用户线程
Ctrl-L    刷新
Numbers    PID 查找: 输入PID,光标将移动到相应的进程上

基础实例:

代码语言:javascript复制
#示例1.只显示root用户进程信息
htop -u root

#上面左上角显示CPU、内存、交换区的使用情况,右边显示任务、负载、开机时间,下面就是进程实时状况。
#下面是 F1~F10 的功能和对应的字母快捷键。

WeiyiGeek.htop

htop配置设定:

代码语言:javascript复制
#鼠标点击Setup或者按下F2之后进入htop设定的页面
Meters #页面设定了顶端的一些信息显示,顶端的显示又分为左右两侧,选择新增显示新增到上方左侧(F5)或是右侧(F6)
Display option #显示选项可要根据管理者自己的需要来设定。
Color #配色方案除了基本的颜色显示之外,还提供了换面板的功能;
Columns #在一般htop 指令进来希望可以看到的什么样的数据及信息,字段的调整可以在这边做个人化的设定

WeiyiGeek.

补充:也许你用惯了top,我们也可以用top来打开htop。

代码语言:javascript复制
#添加一个别名来解决编辑/root/.bashrc文件,添加如下代码
if [ -f /usr/local/bin/htop ]; then
    alias top=’/usr/local/bin/htop’
fi
source /root/.bashrc
bashtop 命令

描述: bashtop 相比于 htop 有种王者的气息,其炫酷无比, 它是一个二进制 shell可执行文件, 直接使用 curl 或者 wget 命令下载到本地并赋予 x 权限即可;

安装地址:

代码语言:javascript复制
# 科学地址
curl -fsSL https://raw.githubusercontent.com/aristocratos/bashtop/master/bashtop -o /usr/bin/bashtop && chmod  x /usr/bin/bashtop

# 国内推荐使用 jsdelivr.net CDN
curl -fsSL https://cdn.jsdelivr.net/gh/aristocratos/bashtop/bashtop -o /usr/bin/bashtop ;chmod  x /usr/bin/bashtop

注意事项:

  • (1) Bash版本需要在4.4及以上进行使用否则运行将会提示ERROR: Bash 4.4 or later is required (you are using Bash 4.2).
0x02 系统内核模块查看修改
sysctl 命令

描述:sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中,用sysctl可以读取设置超过五百个系统变量。 它包含一些TCP/ip堆栈和虚拟内存系统的高级选项,这可以让有经验的管理员提高引人注目的系统性能。

代码语言:javascript复制
#语法
sysctl (选项) (参数)  #变量=值:设置内核参数对应的变量值。

WeiyiGeek.参数

实际案例:

代码语言:javascript复制
#示例1. 查看所有可读变量
sysctl -a | head
# abi.vsyscall32 = 1
sysctl -a -n | more
# 1  #仅仅打印值
sysctl -a -N | more
# abi.vsyscall32 #仅仅打印名称


#示例2.读一个指定的变量,例如abi.vsyscall32: 
sysctl abi.vsyscall32
abi.vsyscall32 = 1


#示例3.设置一个指定的内核变量
sysctl kernel.maxfiles=5000  #要设置一个指定的变量,直接用variable=value这样的语法:
kern.maxfiles: 2088 -> 5000


#示例4.使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量,/etc/sysctl.conf看起来很像rc.conf
sysctl -w net.ipv4.tcp_max_syn_backlog=256   #设置环境变量
sysctl -p   #立马生效,默认在/etc/sysctl.conf,也可以已自己指定配置文件
# sysctl变量的设置通常是字符串、数字或者布尔型,(布尔型(Boole)用 1 来表示'yes',用 0 来表示'no')。
sysctl -w kernel.sysrq=0 
sysctl -w kernel.core_uses_pid=1 
sysctl -w net.ipv4.conf.default.accept_redirects=0 
sysctl -w net.ipv4.conf.default.accept_source_route=0 
sysctl -w net.ipv4.conf.default.rp_filter=1 
sysctl -w net.ipv4.tcp_syncookies=1 
sysctl -w net.ipv4.tcp_max_syn_backlog=2048 
sysctl -w net.ipv4.tcp_fin_timeout=30 
sysctl -w net.ipv4.tcp_synack_retries=2 
sysctl -w net.ipv4.tcp_keepalive_time=3600 
sysctl -w net.ipv4.tcp_window_scaling=1 
sysctl -w net.ipv4.tcp_sack=1


#示例5.如果希望屏蔽别人 ping 你的主机,则加入以下代码
# Disable ping requests 
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -w net.ipv4.ip_default_ttl=215  #设置默认的ping的TTL值
#编辑完成后,请执行以下命令使变动立即生效:
/sbin/sysctl -p 
/sbin/sysctl -w net.ipv4.route.flush=1

WeiyiGeek.案例测试

补充:编辑sysctl配置文件来改变系统内核模块 /etc/sysctl.conf (可直接更改参数)

lsmod 命令

功能:该命令用于显示已经加载到内核中的模块的状态信息(列出系统内核模块-在做grub引导时候您会遇见它), 以美观的方式列出/proc/modules的内容。

实际案例:

代码语言:javascript复制
#示例1.lsmod 介绍
$lsmod | more
Module(模块名)    Size(模块大小)   Used by(被…使用)
# dm_mod                124501  0
# nls_utf8               12557  0
# isofs                  39844  0
# nfit                   55479  0
# libnvdimm             155545  1 nfit
# iosf_mbi               15582  0
# crc32_pclmul           13133  0
# ghash_clmulni_intel    13273  0
# ppdev                  17671  0
# aesni_intel           189456  0
# lrw                    13286  1 aesni_intel
# gf128mul               15139  1 lrw
# glue_helper            13990  1 aesni_intel
# sg                     40719  0
# ablk_helper            13597  1 aesni_intel
# cryptd                 21190  3 ghash_clmulni_intel,aesni_intel,ablk_helper
# i2c_piix4              22401  0
# parport_pc             28205  0
# parport                46395  2 ppdev,parport_pc
# virtio_balloon         18015  0
# joydev                 17389  0
# pcspkr                 12718  0
# ip_tables              27126  0
# xfs                   993020  1
# libcrc32c              12644  1 xfs
# sr_mod                 22416  0
# cdrom                  42556  1 sr_mod
# ata_generic            12923  0
# pata_acpi              13053  0
# virtio_net             28063  0
# virtio_console         28076  1
# virtio_blk             18323  2
# cirrus                 24171  1
# drm_kms_helper        186531  1 cirrus
# syscopyarea            12529  1 drm_kms_helper
# sysfillrect            12701  1 drm_kms_helper
# sysimgblt              12640  1 drm_kms_helper
# fb_sys_fops            12703  1 drm_kms_helper
# ttm                    96673  1 cirrus
# drm                   456166  4 ttm,drm_kms_helper,cirrus
# ata_piix               35052  0
# crct10dif_pclmul       14307  0
# crct10dif_common       12595  1 crct10dif_pclmul
# libata                243133  3 pata_acpi,ata_generic,ata_piix
# crc32c_intel           22094  1
# serio_raw              13434  0
# virtio_pci             22985  0
# virtio_ring            22746  5 virtio_blk,virtio_net,virtio_pci,virtio_balloon,virtio_console
# drm_panel_orientation_quirks    17180  1 drm
# virtio                 14959  5 virtio_blk,virtio_net,virtio_pci,virtio_balloon,virtio_console
# floppy                 69432  0


#示例2.在/proc/modules中相应的是:
$cat /proc/modules | head
(模块名,模块大小,被…使用,模块地址(猜的,以后确认))
# binfmt_misc 17468 1 - Live 0xffffffffc039d000
# coretemp 13444 0 - Live 0xffffffffc0470000
# iosf_mbi 15582 0 - Live 0xffffffffc045c000
depmod 命令

功能:分析可加载模块的依赖性,生成modules.dep文件和映射文件。 Linux内核模块可以为其它模块提供提供服务(在代码中使用EXPORT_SYMBOL),这种服务被称作”symbols”。若第二个模块使用了这个symbol,则该模块很明显依赖于第一个模块,依赖关系是非常繁杂的。

depmod读取在/lib/modules/version 目录下的所有模块,并检查每个模块导出的symbol和需要的symbol,然后创建一个依赖关系列表。

  • 默认地该列表写入到/lib/moudules /version目录下的modules.dep文件中。
  • 若命令中的filename有指定的话,则仅检查这些指定的模块(不是很有用)。
  • 若命令中提供了version参数,则会使用version所指定的目录生成依赖,而不是当前内核的版本(uname -r 返回的)。
代码语言:javascript复制
#用法:
depmod [-b basedir] [-e] [-F System.map] [-n] [-v] [version] [-A]
depmod [-e] [-F System.map] [-n] [-v] [version] [filename...]

#选项:
-b basedir  –basedir basedir  若你的模块并没有正确的在/lib/mdules/version下,可以指定目录生成依赖。
-e  –errsyms  和-F选项一起使用,当一个模块需要的symbol在其它模块里面没有提供时,做出报告。正常情况下,模块没有提供的symbol都在内核中有提供。
-F  –filesyms System.map 提供一个System.map文件(在内核编译时生成的)许-e选项报告出unresolved symbol。
-n  –dry_run  将结果modules.dep和各种映射文件输出到标准输出(stdout),而不是写到模块目录下。
-A –quick  检查是否有模块比modues.dep中的模块新,若没有,则退出不重新生成文件。
modprobe 命令(重要)

功能:modprobe可智能地添加和删除Linux内核模块(为简便起见,模块名中’_’和’-‘是一样的)

modprobe会查看模块 目录/lib/modules/’uname -r’里面的所有模块和文件,除了可选的/etc/modprobe.conf配置文件和/etc/modprobe.d目录外。 modprobe需要一个最新的modules.dep文件,可以用depmod来生成。该文件列出了每一个模块需要的其他模块,modprobe使用这个去自动添加或删除模块的依赖。

语法与参数:

代码语言:javascript复制
modprobe [ -v ] [ -V ] [-C config-file] [ -n ] [ -i ] [ -q ] [ -o modulename] [ modulename ] [ module parameters ... ]
modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename ... ]
modprobe [ -l ] [ -t dirname ] [ wildcard ]
modprobe [ -c ]

#选项:
-v –verbose  显示程序在干什么,通常在出问题的情况下,modprobe才显示信息。
-C –config  重载(^_^,意思取C  的重载)默认配置文件(/etc/modprobe.conf或/etc/modprobe.d)。
-c –showconfig  输出配置文件并退出
-n –dry-run  可以和-v选项一起使用,调试非常有用
-i –ignore-install –ignore-remove 该选项会使得modprobe忽略配置文件中的,在命令行上输入的install和remove命令。
-q –quiet 一般modprobe删除或插入一个模块时,若没有找到会提示错误。使用该选项,会忽略指定的模块,并不提示任何错误信息。
-r –remove  该选项会导致modprobe去删除,而不是插入一个模块。通常没有没有理由去删除内核模块,除非是一些有bug的模块。你的内核也不一定支持模块的卸载。
-V –verssion 版本信息
-f –force  和同时使用–force-vermagic ,–force-modversion一样。使用该选项是比较危险的。
-l –list 列出所有模块
-a –all 插入所有命令行中的模块
-t –type 强制 -l 显示dirname中的模块
-s –syslog 错误信息写入syslog

案例示例:

代码语言:javascript复制
#示例1.前面的导入drbd模块并且验证是否导入
$modprobe drbd && lsmod | grep drbd  #临时生效,重启由需要添加 可用加入到 /etc/rc.local
drbd                  485533  0
libcrc32c                841  1 drbd

#示例2.查看模块依赖(lsmod查询模块名称)
$modprobe -D binfmt_misc
insmod /lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/fs/binfmt_misc.ko.xz
modinfo 命令(重要)

功能:显示内核模块中命令行指定的模块的信息。若模块名不是一个文件名,则会在/lib/modules/version 目录中搜索,就像modprobe一样。 modinfo默认情况下,为了便于阅读,以下面的格式列出模块的每个属性:fieldname : value。

代码语言:javascript复制
#用法:
modinfo [ -0 ] [ -F field] [modulename | filename ... ]
modinfo -V
modinfo -h

#选项:
-V –version 版本
-F –field 仅在一行上显示field值,这对于脚本较为有用。常用的field有:author, description, licence, param, depends, alias, filename。
-0 –NULL 使用’/0′字符分隔field值,而不是一个新行。对脚本比较有用。
-a -d -l -p -n 这些分别是author, description, license, param ,filename的简短形式。

实际案例:

代码语言:javascript复制
#示例1.显示模块信息
$modinfo binfmt_misc
filename:       /lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/fs/binfmt_misc.ko.xz
license:        GPL
alias:          fs-binfmt_misc
retpoline:      Y
rhelversion:    7.6
srcversion:     94E4CE2E390B0EECC8654D6
depends:
intree:         Y
vermagic:       3.10.0-957.12.2.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        8D:E6:4F:B5:96:9B:55:7E:DC:7F:03:2E:EA:BC:BE:4F:37:17:7F:4E
sig_hashalgo:   sha256
insmod 命令

功能:Linux insmod(insert module)命令用于载入模块,在Linux中有许多功能是通过模块的方式,在需要时才载入kernel。 如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。补充Linux内核中插入一个模块,若文件名是一个连字符’-‘,模块从标准输入输入。大多数用户使用modprobe 因为它比较智能化。

基础语法:

代码语言:javascript复制
# 基础语法
insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
insmod [filename] [modue options ...]

# 参数说明
-f  不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k  将模块设置为自动卸除。
-m  输出模块的载入信息。
-o<模块名称> 指定模块的名称,可使用模块文件的文件名。
-p  测试模块是否能正确地载入kernel。
-s  将所有信息记录在系统记录文件中。
-v  执行时显示详细的信息。
-x  不要汇出模块的外部符号。
-X  汇出模块所有的外部符号,此为预设置。

基础实例:

代码语言:javascript复制
# 1.向内核加载模块
insmod led.o 

# 2.grub 使用到的模块加载到内核之中
function load_video {
  # 载入模块
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}
rmmod 命令

功能:rmmod是一个可以从内核中删除模块的小程序,大多数用户使用modprobe -r去删除模块。

代码语言:javascript复制
用法:rmmod [ -f ] [ -w ] [ -s ] [ -v ] [ modulename ]
选项:
-v –verbose  显示程序正在做些什么,一般只显示执行时的错误信息。
-f –force  该选项是非常危险:除非编译内核时,CONFIG_MODULE_FORCE_UNLOAD被设置该命令才有效果,否则没效果。用该选项可以删除正在被使用的模块,设计为不能删除的模块,或者标记为unsafe的模块。
-w –wait 通常,rmmod拒绝删除正在被使用的模块。使用该选项后,指定的模块会被孤立起来,直到不被使用。
-s  –syslog  将错误信息写入syslog,而不是标准错误(stderr)。
-V  –version 版本信息
capsh 命令 - 能力外壳包装工具

描述: Linux capability 的支持和使用可以通过这个工具进行探索和限制。这个工具为某些类型的功能测试和环境创建提供了一个方便的包装器,它还提供了一些用于总结功能状态的调试功能。

overview of Linux capabilities 参考地址: https://man7.org/linux/man-pages/man7/capabilities.7.html

从内核 2.2 开始,Linux 划分权限传统上与超级用户相关联成不同的单元称为功能,可以独立启用和禁用,功能是每个线程的属性, 它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作。

Capabilities的主要思想在于分割root用户的特权,即将root的特权分割成不同的能力,每种能力代表一定的特权操作。

例如: CAP_SYS_MODULE 表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程用户身份的特权操作。在Capbilities中系统将根据进程拥有的能力来进行特权操作的访问控制

在Capilities中只有进程可执行文件才具有能力,每个进程拥有三组能力集,分别称为cap_effective, cap_inheritable, cap_permitted (分别简记为:pE,pI,pP),可执行文件也拥有三组能力集,分别称为cap_effective, cap_allowed 和 cap_forced(分别简记为fE,fI,fP)

进程拥有三组能力集 cap_permitted : 表示进程所拥有的最大能力集。 cap_inheitable : 表示进程可以传递给其子进程的能力集 cap_effective : 表示进程当前可用的能力集。(为cap_permitted的子集)

可执行文件拥有三组能力集 cap_allowed : 表示程序运行时可从原进程的cap_inheritable中集成的能力集,cap_forced : 表示运行文件时必须拥有才能完成其服务的能力集; cap_effective ::表示文件开始运行时可以使用的能力。

补充说明: 你可能会常常看见 cap_chown=eip, 它是将 chown 的能力以 cap_effective(e), cap_inheritable(i), cap_permitted(p) 三种位图的方式授权给相关的程序文件.

常见的 Linux capability 列表:

  • CAP_AUDIT_CONTROL (自 Linux 2.6.11 起)启用和禁用内核审计, 更改审核过滤器规则, 检索审核状态和过滤规则。
  • CAP_AUDIT_READ (自 Linux 3.16 起)允许通过多播网络链接读取审核日志插座。
  • CAP_AUDIT_WRITE (自 Linux 2.6.11 起)将记录写入内核审计日志。
  • CAP_BLOCK_SUSPEND (自 Linux 3.5 起)使用可以阻止系统挂起的功能
  • CAP_BPF (自 Linux 5.8 起) 使用特权 BPF 操作
  • CAP_CHECKPOINT_RESTORE (自 Linux 5.9 起) ;更新 /proc/sys/kernel/ns_last_pid, 使用 set_tid 的特征, 读取符号链接的内容
  • CAP_CHOWN: 对文件 UID 和 GID 进行任意更改
  • CAP_DAC_OVERRIDE: 绕过文件读取、写入和执行权限检查。DAC是“discretionary access”的缩写 控制”
  • CAP_DAC_READ_SEARCH: 绕过文件读取权限检查和目录读取并执行权限检查;
  • CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制
  • CAP_FSETID: 允许设置文件的setuid位和setgid。
  • CAP_KILL: 允许对不属于自己的进程发送信号
  • CAP_SETGID: 允许改变进程的组ID
  • CAP_SETUID: 允许改变进程的用户ID
  • CAP_SETPCAP: 允许向其他进程转移能力以及删除其他进程的能力
  • CAP_LINUX_IMMUTABLE: 允许修改文件的IMMUTABLE和APPEND属性标志
  • CAP_NET_BIND_SERVICE: 允许绑定到小于1024的端口
  • CAP_NET_BROADCAST: 允许网络广播和多播访问
  • CAP_NET_ADMIN: 允许执行网络管理任务,接口配置,管理 IP 防火墙、伪装和会计,修改路由表,绑定到任何地址进行透明代理,设置服务类型(TOS),设置混杂模式,启用多播;
  • CAP_NET_RAW: 允许使用原始套接字
  • CAP_IPC_LOCK: 允许锁定共享内存片段,使用大页面分配内存。
  • CAP_IPC_OWNER: 忽略IPC所有权检查
  • CAP_SYS_MODULE: 允许插入和删除内核模块
  • CAP_SYS_RAWIO: 允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备
  • CAP_SYS_CHROOT: 允许使用chroot()系统调用,更改挂载命名空间
  • CAP_SYS_PTRACE: 允许跟踪任何进程
  • CAP_SYS_PACCT: 允许执行进程的BSD式审计
  • CAP_SYS_ADMIN: 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
  • CAP_SYS_BOOT: 允许重新启动系统
  • CAP_SYS_NICE: 允许提升优先级及设置其他进程的优先级
  • CAP_SYS_RESOURCE: 忽略资源限制
  • CAP_SYS_TIME: 允许改变系统时钟
  • CAP_SYS_TTY_CONFIG: 允许配置TTY设备
  • CAP_MKNOD: 允许使用mknod()系统调用
  • CAP_LEASE: 允许修改文件锁的FL_LEASE标志

语法&参数

代码语言:javascript复制
# capsh [OPTION]...
--print   # 显示主要能力和相关状态。
-- [args] # 使用尾随参数执行/bin/bash,注意对于特定命令,可以使用-c“command to execute”。   
==        # 使用剩余参数再次执行capsh。                  
--caps=cap-set   # 将流行的过程能力设置为由 cap-set 指定的那些。
--drop=cap-list  # 从流行的边界集中删除列出的功能。 这些功能是由 cap_from_name(3) 函数识别的以逗号分隔的功能列表。 
--inh=cap-list   # 将当前进程的可继承功能集设置为与逗号分隔列表中提供的相同,要使此操作成功,主流进程应该已经在当前可继承和允许的能力集的联合中拥有这些能力中的每一个,或者 capsh 程序在其有效集中使用 CAP_SETPCAP 运行。

--user=username  # s使用假定命名用户的身份,执行此命令后,有效功能将被清除,但允许的设置不会被清除,因此正在运行的程序仍然具有特权。
--modes       # 列出 --mode 支持的所有 libcap 模式。          
--mode=<mode> # 强制程序进入 cap_set_mode(3) 安全模式。 这是一组为其预先确定的安全立场推荐的安全位和普遍的能力安排。        
--inmode=<mode>  # 确认流行模式是这样命名的,或者以状态 1 退出。     
--uid=id         # 使用 setuid(2) 系统调用强制所有 uid 值等于 id。
--cap-uid=<uid>  # 使用 cap_setuid(3) 函数设置当前进程的 uid。    
--is-uid=<id>    # 除非当前 uid 等于 <id>,否则以状态 1 退出。     
--gid=<id>       # 使用 setgid(2) 系统调用强制所有 gid 值等于 id。     
--is-gid=<id>    # 以状态 1 退出,除非当前 gid 等于 <id>。    
--groups=<gid-list> # 将补充组设置为提供的数字列表。  
--keep=<0|1>     # 在非纯能力模式下,内核为超级用户提供自由权限,设置为1将导致保持上限处于活动状态,设置为0将导致当前进程停用保持上限。    
--chroot=path  # 使用等于路径的新根目录 (/) 执行 chroot(2) 系统调用。       
--forkfor=sec  # 该命令设置 程序 fork 一个子进程的秒数。    
--killit=sig   # 导致 --forkfor 子进程使用指定的信号被 kill(2)d。       
--decode=N     # 解码在/proc/<pid>/status中查看查看到的CapInh、CapPrm、CapEff、CapBnd
--supports=xxx # 随着内核的发展会添加更多功能,此选项可用于验证系统上是否存在功能。       
--has-p=xxx    # 以状态1退出,除非允许向量具有提升的能力。
--has-ambient  # 执行检查以查看正在运行的内核是否支持环境功能。否则,capsh命令将以状态1退出。
--has-a=xxx    # 以状态1退出,除非环境向量具有提升的能力。
--addamb=xxx   # 将特定的环境功能添加到正在运行的进程中。       
--delamb=xxx   # 从正在运行的进程中删除指定的环境容量。      
--noamb        #  从正在运行的进程中删除所有环境功能。

基础示例

代码语言:javascript复制
# 示例1.查看当前系统支持的 capability 。
$ capsh --print
  # Current: =ep
  # Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
  # Ambient set =
  # Securebits: 00/0x0/1'b0
  # secure-noroot: no (unlocked)
  # secure-no-suid-fixup: no (unlocked)
  # secure-keep-caps: no (unlocked)
  # secure-no-ambient-raise: no (unlocked)
  # uid=0(root) euid=0(root)
  # gid=0(root)
  # groups=0(root)
  # Guessed mode: UNCERTAIN (0)

# 示例2.查看docker守护进程支持的能力,使用--decode=参数进行能力解码。
$ cat /proc/`pidof dockerd`/status | grep Cap
# CapInh: 0000000000000000
# CapPrm: 0000003fffffffff
# CapEff: 0000003fffffffff
# CapBnd: 0000003fffffffff
# CapAmb: 0000000000000000
$ capsh --decode=0x3fffffffff
# 0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read

# 示例3.列出 --mode 支持的所有 libcap 模式。
$ capsh --modes
`# Supported modes: NOPRIV PURE1E_INIT PURE1E

0x03 环境变量
set 命令

描述:set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值,使用set更改shell特性时,符号” ”和”-“的作用分别是打开和关闭指定的模式.

Tips : set命令不能够定义新的shell变量,如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可,set/env命令可以查看所有的shell变量,其中包括环境变量

常见的环境变量:

代码语言:javascript复制
$USER 查看账户信息
$logname 登录相关信息
$UID
$Shell
$HOME 家目录
$pwd
$PATH 用户所输入的命令是在哪些目录中查找
$PS1
$PS2
$RANDOM 随机数

语法参数:

代码语言:javascript复制
#语法
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

#选项
-/  x :执行时候显示参数和命令开启/关闭调试
-/  v :当命令进入读取时候显示输入/禁止打印输入
-n : 读取命令但不执行命令
-a : 设置为环境变量
-e : 如果命令执行出现非零状态,则立即退出。
-u : 命令后系统会明确提示没有变量(验证变量)

Options:
  -a  Mark variables which are modified or created for export.
  -b  Notify of job termination immediately.
  -e  Exit immediately if a command exits with a non-zero status.
  -f  Disable file name generation (globbing).
  -h  Remember the location of commands as they are looked up.
  -k  All assignment arguments are placed in the environment for a
      command, not just those that precede the command name.
  -m  Job control is enabled.
  -n  Read commands but do not execute them.
  -p  Turned on whenever the real and effective user ids do not match.
      Disables processing of the $ENV file and importing of shell
      functions.  Turning this option off causes the effective uid and
      gid to be set to the real uid and gid.
  -t  Exit after reading and executing one command.
  -u  Treat unset variables as an error when substituting.
  -v  Print shell input lines as they are read.
  -x  Print commands and their arguments as they are executed.
  -B  the shell will perform brace expansion
  -C  If set, disallow existing regular files to be overwritten
      by redirection of output.
  -E  If set, the ERR trap is inherited by shell functions.
  -H  Enable ! style history substitution.  This flag is on
      by default when the shell is interactive.
  -P  If set, do not resolve symbolic links when executing commands
      such as cd which change the current directory.
  -T  If set, the DEBUG and RETURN traps are inherited by shell functions.
  --  Assign any remaining arguments to the positional parameters.
      If there are no remaining arguments, the positional parameters
      are unset.
  -   Assign any remaining arguments to the positional parameters.
      The -x and -v options are turned off.
  -o option-name
    Set the variable corresponding to option-name:
        allexport    same as -a
        braceexpand  same as -B
        emacs        use an emacs-style line editing interface
        errexit      same as -e
        errtrace     same as -E
        functrace    same as -T
        hashall      same as -h
        histexpand   same as -H
        history      enable command history
        ignoreeof    the shell will not exit upon reading EOF
        interactive-comments  allow comments to appear in interactive commands
        keyword      same as -k
        monitor      same as -m
        noclobber    same as -C
        noexec       same as -n
        noglob       same as -f
        nolog        currently accepted but ignored
        notify       same as -b
        nounset      same as -u
        onecmd       same as -t
        physical     same as -P
        pipefail     the return value of a pipeline is the status ofthe last command to exit with a non-zero status,or zero if no command exited with a non-zero status
        posix        change the behavior of bash where the default operation differs from the Posix standard to match the standard
        privileged   same as -p
        verbose      same as -v
        vi           use a vi-style line editing interface
        xtrace       same as -x

WeiyiGeek.set参数

实际案例:

代码语言:javascript复制
#示例1.set新定义变量输出为shell环境变量
$declare test="setdemo"
$env | grep "test" # #环境变量为空

$set -a test  #设置后用户环境变量不为空
$env | grep "test"  #系统环境变量为空
$set | grep "test"  #shell变量 存在
BASH_ARGV=([0]="test.sh")
BASH_SOURCE=([0]="test.sh")
test=setdemo


#示例2.验证变量是否存在
set -u $test  # 如果设定此选项,调用未声明变量时会报错(默认调用未声明变量是为空)
set -u $testww
-bash: wwww:未绑定的变量
echo $?
1


#示例3.shell脚本自身已经包含了调式选项,能都打印出脚本接受的参数和输入。
#仅在 -x 和  x 的区域中才会显示调式信息
#!/bin/bash
for i in {1..5}
do
set -x   #开启调试
 echo $i
set  x   #关闭调试
done
echo "end"

#调试信息
. ./www.sh
   echo 1
1
   set  x
   echo 2
2
   set  x
   echo 3
3
   set  x
   echo 4
4
   set  x
   echo 5
5
   set  x
end

# 示例4.脚本错误机制
set -o errexit  # 如果命令以非零状态退出,请立即退出。
set -o pipefail # 管道的返回值是最后一个以非零状态退出的命令的状态,如果没有命令以非零状态退出,则返回零
set -o xtrace   # 在执行命令时打印命令及其参数。


# 示例5.位置参数设置
set -- 1 2 3 whoami id
~$ echo $@
# 1 2 3 whoami id
~$ $5
uid=1000(app) gid=1000(app) groups=1000(app),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd),998(docker)

补充知识点

  • 与bash -x相比,set -x可以缩小调试的作用域;
unset 命令

描述:用于删除已定义的shell变量(包括环境变量)和shell函数. 注意:unset命令不能够删除具有只读属性的shell变量和环境变量.

代码语言:javascript复制
unset (选项) (参数)  #参数指定要删除的shell变量或shell函数
#选项:
-f: 仅仅删除函数
-v:仅删除变量名

实际案例:

代码语言:javascript复制
#示例1.删除指定环境变量注意(在Centos7或者说内核在3.10版本上是区分了shell变量和系统变量的)
unset -v test
unset -f function_name   #放在调用的前面!!!
set | grep "test"  #删除set中shell环境变量
export 命令

描述:用于将shell变量输出为环境变量,或者将shell函数输出为环境变量,还可用于传递一个或多个变量的值到任何后继脚本。

在配置交叉编译工具链的时候需要指定编译工具的路径此时就需要设置环境变量,比如配置JAVA环境以及MYSQL环境;

一个变量创建时,它不会自动地为在它之后创建的shell进程所知,当一个shell脚本调用并执 行时它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用,而命令export可以向后面的shell传递变量的值

语法参数:

代码语言:javascript复制
#语法
export [参数] 变量名=变量值
#或者
变量名=变量值;export 遍历名 

#选项
-f:代表[变量名称]中为函数名称;
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中;
-p:列出所有的shell赋予程序的环境变量。

实际案例:

代码语言:javascript复制
#示例1.查看已经存在的环境变量
export
export -p
# declare -x HISTCONTROL="ignoredups"
# declare -x HISTSIZE="1000"
# declare -x HOME="/root"
# declare -x HOSTNAME="master"
# declare -x LANG="zh_CN.UTF-8"

#示例2.
export -f #查看函数名称
export -n TEST #删除环境变量

0 人点赞