变量
变量的概述:存储变化数据的内存空间地址;变化的是数据,不变的是内存的空间地址
数学的概念:x+2=4 x=2
x是变量,2就是变量的值
x是内存空间地址,2是内存的数据
例如:变量ip_address,值是$(ifconfig | grep netmask | awk ‘{print $2}’)
变量ip_addess是不变的,变的是$(ifconfig | grep netmask | awk ‘{print $2}’)
系统想要使用这个值的话,只需要找到ip_addess这个变量即可
变量的组成:
变量名=变量值
变量名:数字、下划线、字母组成;不能以数字开头
定义变量:
A=100 变量名=变量值
export A=100 变量名=变量值
变量类型:
本地变量:用户自定义的变量
环境变量:存储系统相关的变量
(系统变量)
PATH变量:记录系统中可执行文件的路径了,在此目录中才能够作为命令执行
PS1变量:命令的提示符
引用变量:
$变量名 ${变量名}
查看变量:
set 查看所有的变量(包括本地变量以及环境变量)
env 查看环境变量
本地变量和环境变量的区别:
作用范围:本地变量--->当前的shell中生效
环境变量--->当前的shell和子shell中生效
取消变量:
unset 变量名
引号和反斜杠
引号和反斜杠都是属于转义字符,是为了去掉后面符号的特殊意义
\ 反斜杠,去掉反斜杠后面单个字符的意义
eg : echo \$5
单引号:去掉引号内部所有字符的特殊意义(强引用)
双引号:去掉引号内部所有字符的特殊意义(弱引用)有缺陷的
有4个符号无法去掉: $变量引用符号 \ 反斜杠 !历史条目调用 ` ` 命令的执行符号
别名
系统当中的别名是为了简化命令的执行;例如grep 命令的别名是grep –color=auto 所以grep才有高亮
定义别名:
alias 别名=’执行的命令’
查看别名:
alias 查看系统中全部的别名
alias 别名 查看指定的别名
取消别名:
unalias 别名
用户登录shell
用户通过不同的登录方式可以获取到不同的shell操作环境;如果你是使用图形化登录,或者是命令行(字符页面)登录,或者是su – 切换用户,都会获取到不同的shell操作环境
类型:
登录shell(理解为用户登录到了系统,一般需要输入账号密码)
图形化登录;字符页面登录;su – 切换用户
非登录shell(理解为用户没有登录到这个系统,只是登录到了shell的操作环境)
su 切换用户;打开虚拟终端/伪终端;执行脚本
区别:
登录shell指登录到了操作系统;
非登录shell指用户获得了shell的操作环境;
它们的区别其实在于登录shell和非登录shell所触发的变量文件(触发shell的文件)是不一样的
变量文件:
/etc/bashrc /etc/profile ~username/.bashrc ~username/.bash_profile
登录shell触发的文件: su – 用户
/etc/profile 全局文件
/etc/bashrc 全局文件
~username/.bashrc 用户文件
~username/.bash_profile 用户文件
非登录shell触发的文件:
/etc/bashrc
~username/.bashrc
系统中所有的用户 变量A的值都是100,只有user用户变量A的值是1000
在/etc/bashrc中写入 A=100,在~user/.bashrc中写入A=1000
触发变量文件的优先级:
先加载的是全局文件,再加载用户文件
/etc/bashrc -> /etc/profile -> ~username/.bashrc -> ~username/.bash_profile
变量文件中推荐定义的方式:
无论是登录shell还是非登录shell,切换用户想要让变量和别名都生效的话,那么就将变量或者别名写入到~username/.bashrc
无论是登录shell还是非登录shell,想要所有的用户的变量和别名都生效的话,那么就写入/etc/bashrc
用户登出shell
触发配置文件:~username/.bash_logout
当退出系统才会触发此文件,图形化的终端标签页退出、注销、重启不会触发;
触发机制: 远程ssh连接退出触发;字符页面exit退出再次登录触发
进程管理
进程是应用程序运行的时候产生的,也是一个程序运行的实例;
在Linux中,运行某个命令或者启动服务,都会有一个进程;
每一个进程在系统中会分配一个唯一的ID号(PID)
当程序结束的时候,PID会被回收,下一次其他的程序运行时可能会将ID分配出去
进程的权限来自于用户的权限,继承用户的权限;哪个用户运行,那么进程就进程哪个用户的UID和GID
ps查看静态进程
PID TTY TIME CMD
2213 pts/0 00:00:00 bash
5072 pts/0 00:00:00 ps
PID:进程ID号
TTY:得到终端的方式
pts表示伪终端(远程ssh连接、图形化登录)
tty[1-6] 表示终端设备,显示屏直连,tty2表示有桌面的环境
? 表示没有终端,是内核进程
TIME:表示进程的持续时间;0表示刚刚发起或者一直在运行
CMD:运行的命令
w 查看当前系统登录的用户(who)
ps 选项:
ps -a 查看所有终端执行的进程
ps -ax 查看不属于终端的进程
x表示查看内核进程;Tty是? 表示是内核运行的进程
ps -ao user,%cpu,%mem,command
-o 指定选项
ps -ef === ps -aux
-e 查看所有进程
-f 查看用户 PID PPID C(cpu资源占比) STIME(系统启动时间) command
--sort:指定排序的参数;例如 ps -aux --sort=-%cpu 按照cpu占比大小进行降序
ps -aux --sort=%cpu | tail
eg:ps -aux --sort=-%cpu | head 查看cpu占比最高的进程
ps -aux --sort=%cpu | tail 查看cpu占比最高的进程
RHEL9中,有考题会考到,编写一个脚本监控系统状态,监控CPU和内存的资源状态
top实时查看系统进程
默认每3秒刷新一次
-d 指定刷新间隔时间(top -d 2)
-p 查看指定pid的进程状态
top - 11:38:40 up 9 days, 2:42, 2 users, load average: 0.00, 0.00, 0.00
load average:平均负载时间(每分钟、每5分钟、每15分钟)
和CPU相关
以单核CPU为例:
以每分钟为例
如果负载小于1,表示CPU空闲
如果负载等于1,表示CPU全力运行
如果负载大于1,表示CPU超负荷
进程有父进程和子进程的概念
系统中有两个较为特殊的进程:僵尸进程、孤儿进程
如果是僵尸进程,一定要特别重视,会消耗系统的cpu 内存资源
如果是孤儿进程,不会占用系统的cpu 内存资源,PID为1的进程会接管孤儿进程然后关闭它
产生的原因:
系统中的进程有父进程的概念,父进程会派出子进程干活;
孤儿进程:(父进程退出了,子进程还在干活;父进程先一步比子进程退出)
产生原因:用户手动关闭父进程或者程序BUG导致父进程比子进程先退出
派出来的子进程在干活中,父进程可能因为程序BUG或者特殊原因退出了,子进程就成为了孤儿进程。这个时候系统PID为1的进程会接管孤儿进程(rhel7是init,rhel7以后是systemd,是系统启动运行的第一个进程,也是系统的守护进程),然后关闭孤儿进程。
僵尸进程:(子进程已经干完活了,要告诉父进程我的活儿已经干完了,需要父进程接受我的信息,释放我)
产生原因:程序BUG或者人为故意放出病毒,子进程干完活儿了向父进程发送退出的信息,父进程没接收到,进程就会一直向父进程发送,成为僵尸进程
0.4 us, 0.6 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.2 hi, 0.1 si, 0.0 st
us:用户空间占用cpu百分比
例如shell程序、开启的应用软件、桌面等
sy:内核空间占用cpu百分比
例如系统分配内存、执行的IO操作等
ni:用户自定义优先级的进程占用cpu百分比
id:cpu的空闲百分比
wa:等待磁盘IO操作的时间
时间越长,表示cpu和磁盘的性能差距越大,要检测是不是系统有非常的IO
hi:硬中断
表示硬盘、网卡等硬件设备发送CPU的中断消息,CPU处理消耗的时间
si:软中断
表示软件发送CPU的中断消息,CPU处理消耗的时间
st:虚拟机等待cpu的时间
只有当系统是虚拟机的时候关注此项
top命令过程可以使用一些交互式的命令
1 查看每个逻辑cpu的资源信息
M 按照占用内存的百分比进行排序
m 查看内存进度条模式的百分比
P 按照CPU的百分比进行排序
c 显示命令的名称
T 根据占用的时间进行排序
k 杀死pid
pgrep 通过信息查询进程
-U 通过用户名查找进程
-G 通过用户组查找进程
-u 通过uid查找进程
-g 通过gid查找进程
-P 通过父进程查找子进程
-l 打印命令
-o 如果有多个进程运行,则查找最早运行的进程
-n 如果有多个进程运行,则查找最晚运行的进程
eg:pgrep -n / -o vim
-d 指定分隔符(shell脚本中应用的较多)
可以把过滤出来的进程根据分隔符进行分割
pidof 根据进程名称查询
pgrep 模糊查询
pidof 精确查询
eg: pidof ssh 和 pgrep ssh
只要包含关键字ssh,pgerp就可以查询到
pidof必须写全
进程之间的通信方式
进程和进程直接按的沟通?
管道、信号、消息队列、共享内存、socket套接字等
Linux中默认使用信号进行通信
当进程接受到信号后,优先执行信号的操作;
信号的产生:
内核产生;用户手动发送信号
常用的信号:
列出信号 kill -l
signal 15 默认,关闭程序
signal 9 强制退出 (一般不建议使用,会造成文件无法写入数据)
rhel9中,vim更加灵活,使用-9 强制结束不会出现.swap文件(vim 文件 命令模式)
rhel8中,使用-9 强制结束会出现.swap文件(vim 文件,无论是什么模式)
signal 1 重新加载配置文件
发送信号:
根据进程id kill 工具
根据进程名 killall (会一并关闭所有的进程)
结束一整个中断的进程 pkill -t pts/2
pkill : ps和kill结合
可以结束一个终端、一个用户的所有进程
pkill -t tty1 结束终端1下的进程
pkill -kill / -9 -t pts/2 踢用户
pkill -u 用户 结束指定用户的所有进程
pkill -9 vim 强制结束进程
进程的优先级
在系统繁忙的时候,高优先级的进程最优先分配CPU资源
优先级越高,进程越优先分配cpu资源
Linux进程中有两种优先级:
PR 动态优先级 (内核自动调整)
NI 静态优先级 (用户手动调整)
ni优先级的范围:-20~19 ;(数字越小,优先级越高;root用户才能修改ni值)
调整ni值
修改已经启动的ni值: renice -n 15 8004
在启动进程的时候调整ni值:nice -n -20 vim a
后台作业
将一个进程放入到后台执行,让前端终端能够输入命令,不被进程占用;
格式: 命令 & (&符号表示将作业放入后台)
jobs查看当前终端的作业
kill %1 结束作业
bg %1 后台运行
fg %1 前台运行
Ctrl+z 或者 kill -19 停止作业