【Linux】shell脚本和bat脚本:

文章目录


一、脚本对应环境:

【1】shell:linux环境;后缀名为.sh

主要用在linux中,而linux系统对应的shell又有很多,如Bourne Shell(/usr/bin/sh或/bin/sh),又如Bourne Again Shell(/bin/bash)由于Bourne Again Shell(/bin/bash)免费且易用,故使用较多。

对应的脚本文件后缀名为.sh

注:
#!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。如#!/bin/sh,#!/bin/bash,通常放于脚本文件首行。

【2】bat:windows环境;后缀名为.bat或者.cmd

主要用于windows中,又名批处理文件,其每一行指令都是一条dos指令,对应脚本文件后缀名为.bat或者.cmd。

二、脚本执行:

【1】shell执行

1.直接在bash命令窗口执行shell相关命令。

2.将shell命令保存为文件,执行文件就可以运行shell命令。

注:由于在linux中对文件的权限管理较细,故如果使用shell脚本文件,必须使其具有可执行权限,对脚本授权chmod +x ./文件名.sh #使脚本具有执行权限,执行脚本./test.sh #执行脚本,./必须加,因为当前文件没有加入到linux的path中,linux仅只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 path中。

【2】bat脚本执行

1.直接在windows的dos窗口即cmd窗口执行bat相关命令。

2.将bat命令保存为bat文件,在windows中文件权限限制没有linux中那么严格,故相关bat脚本文件可以直接双击执行或者命令行执行

三、脚本相关命令:

1. shell命令
【1】shell变量
bash 复制代码
#!/bin/bash
# 定义变量如下,变量名和等号之间不能有空格
name="变量定义"
# 变量使用,使用一个定义过的变量,只要在变量名前面加美元符号即可
echo $name
# 变量外面的花括号是为了区分边界,加不加都可以
echo ${name}  # $只在使用变量的时候加,再次赋值不加

#使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
name="哈哈哈"
readonly name
name="修改只读变量"  # 报错/bin/sh: NAME: This variable is read only.

# 使用 unset 命令可以删除变量,变量被删除后不能再次使用,unset 命令不能删除只读变量。
name="旺旺旺"
unset name  # 删除name变量
echo ${name} # 无输出

# 字符串可以使用单引号'',也可以使用双引号"",也可以不用引号
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的,可以用作字符串拼接使用
# 双引号里可以有变量,也可以出现转义字符
name_one='单引号'
name_one_p='单引号拼接,'${name_one}'拼接结束'
echo ${name_one_p}    # 输出:单引号拼接,单引号拼接结束
name_two="双引号"
name_two_p1="双引号拼接1,${name_two}拼接结束"
name_two_p2="双引号拼接2,"${name_two}"拼接结束" 
echo ${name_two_p1} ${name_two_p2}  #输出:双引号拼接1,双引号拼接结束 双引号拼接2,双引号拼接结束

# 获取字符串长度,变量为数组时,${#arr} 等价于 ${#arr[0]}
name="哈哈哈"
echo ${#name}    # 输出:3

# 提取子字符串,从第4个字符开始提取2个字符(第一个字符的索引值为 0)
name="小不点最爱喝兽奶"
echo ${name:3:2}  # 输出:最爱

# 查找子字符串,查找字符'奶'或'爱'的位置(哪个字母先出现就计算哪个)。这个查找中文有点瑕渍,应该是字符编码问题。
name="wafenhicfsr"  
echo `expr index "${name}" cf`  # 输出:3

# 数组:bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
# 定义数组:用括号来表示数组,数组元素用"空格"符号分割开
arr=(v1 v2 v3 ... vn)
arr=(
  lily
  汤姆
  123
)
arr[0]=哈哈哈  # 单独定义数组的各个分量
arr[2]="123"
arr[n]="nnn"    # 可以不使用连续的下标,而且下标的范围没有限制。
# 读取数组格式 ${数组名[下标]}
arr=(lily 汤姆 123)
echo ${arr[1]}  # 输出:汤姆
# 使用 @ 符号可以获取数组中的所有元素
echo ${arr[@]} # 输出:lily 汤姆 123
# 获取数组的长度
echo ${#arr[@]}    # 取得数组元素的个数
echo ${#arr[*]}    # 取得数组元素的个数
echo ${#arr[1]}    # 取得数组单个元素的长度

# 注释,常用的都是以#为注释
:<<EOF 注释... EOF
或
:<<z 注释 z
或
:<<! 注释... !
【2】为shell脚本传递参数

脚本中以n获取参数, 0 为执行的文件名(包含文件路径),1接受第一个参数,2第二个参数...,以此类推

bash 复制代码
# 文件名./test.sh
#!/bin/bash
echo "shell传参脚本学习"
echo "执行的文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "传递到脚本的参数个数:$#"
echo "以\"1参 2参 3参 n参\"的形式输出所有参数:$*"
echo "脚本运行的当前进程ID号:$$"
echo "后台运行的最后一个进程的ID号:$!"
echo "与\$*相同,但是使用时加引号,并在引号中返回每个参数:$@"
echo "显示Shell使用的当前选项:$-"
echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误:$?"

修改test.sh文件为可执行:chmod -x test.sh

执行test.sh文件:./test.sh 12 哈哈哈 fggg

执行结果如图:

【3】shell数组

Bash Shell 只支持一维数组(不支持多维数组),且各值以空格分开

bash 复制代码
# 1.普通数组
arr_ordinary=("lily" 123 "哈哈哈")  # 定义
echo ${arr_ordinary[1]}    # 访问
# 2.关联数组(与Map类似):可以使用任意的字符串、或者整数作为下标来访问数组元素。
# 语法:declare -A array_name, -A 选项就是用于声明一个关联数组。
declare -A arr_correlation=(["name"]="lily" ["age"]=18 ["sex"]="男")
# 也可以先声明一个关联数组,然后再设置键和值
declare -A arr_declare
arr_declare["name"]="lily"
arr_declare["age"]=18
arr_declare["sex"]="男"
# 使用键来访问数组
echo ${arr_declare["name"]}
# 获取数组中所有元素,使用 @ 或 * 可以获取数组中的所有元素
echo "数组的值为: ${arr_declare[*]}"   
echo "数组的值为: ${arr_declare[@]}"    # 相当于map中获取所有值value
echo "数组的键为: ${!arr_declare[*]}"
echo "数组的键为: ${!arr_declare[@]}"  # 相当于map中获取所有键
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
【4】shell运算符
bash 复制代码
#【1】算术运算符
a1=6
a2=2
# 1.加,+
echo `expr $a1 + $a2`  # 输出8
# 2.减,-
echo `expr $a1 - $a2`  # 输出4
# 3.乘,*
echo `expr $a1 \* $a2`  # 输出12,乘法的*前面必须加\
# 4.除,/
echo `expr $a1 / $a2`  # 输出3
# 5.取余,%
echo `expr $a1 % $a2`  # 输出0
# 6.赋值,=
a1=$a2  # 将变量a2的值赋给a1
# 7.相等,==,比较两个数字相等返回true
[ $a1 == $a2 ]  # 不能echo,不能直接使用,必须配合if或者test使用
# 8.不相等,!=,比较两个数字不相等返回true
[ $a1 != $a2 ]

#【2】关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
且不能直接使用,只能配合if或者test使用
a1=2
a2=4
# 检测两个数是否相等,相等返回 true
[ $a1 -eq $a2 ]   # 返回false
# 检测两个数是否不相等,不相等返回 true
[ $a1 -ne $a2 ]   # 返回 true
# 检测左边的数是否大于右边的,如果是,则返回 true
[ $a1 -gt $a2 ]  # 返回false
# 检测左边的数是否小于右边的,如果是,则返回 true
[ $a1 -lt $a2 ]  #返回 true
# 检测左边的数是否大于等于右边的,如果是,则返回 true
[ $a1 -ge $a2 ]  #返回 false
# 检测左边的数是否小于等于右边的,如果是,则返回 true
[ $a1 -le $a2 ]  #返回 true

#【3】布尔运算符
a1=2
a2=4
# 非运算(!),表达式为 true 则返回 false,否则返回 true
[ ! false ]  # 返回 true
# 或运算(-o),有一个表达式为 true 则返回 true
[ $a1 -lt 2 -o $a2 -gt 4 ] 返回 false
# 与运算(-a),两个表达式都为 true 才返回 true
[ $a1 -lt 2 -a $a2 -gt 4] 返回 false

#【4】逻辑运算符
a1=2
a2=4
# 逻辑的 AND(&&)
[[ $a -lt 4 && $b -gt 5]]  # 返回 false
# 逻辑的 OR(||)
[[ $a -lt 4 || $b -gt 5]]  # 返回 true

#【5】字符串运算符
a1="hhh"
a2="ggg"
# (=)检测两个字符串是否相等,相等返回 true
[ $a1 = $a2 ]  # 返回 false
# (!=)检测两个字符串是否不相等,不相等返回 true
[ $a1 != $a2 ]  # 返回 true
# (-z)检测字符串长度是否为0,为0返回 true
[ -z $a ]  # 返回 false
# (-n)检测字符串长度是否不为 0,不为 0 返回 true
[ -n "$a" ]  # 返回 true
# ($)检测字符串是否不为空,不为空返回 true
[ $a ]  # 返回 true

#【6】shell输出语句
1.echo:输出字符串,一般使用情况
2.printf:格式化输出字符串,功能更强,类似于c语言的输出
语法为:printf format-string [arguments...]
如:printf "%-10s %-8s %-5d\n" 姓名 性别 年龄

#【7】test命令
# 代码中的 [] 执行基本的算数运算
num1=100
num2=100
if test $[num1] -eq $[num2]  # 测出test后面的语句看shell相关运算符
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

#【8】流程控制语句
#(8.1) if语句
# 语法如下
if condition
then
    command1 
    command2
    ...
    commandN 
fi
# 写成一行
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

#(8.2) if-else语句
# 语法如下
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

#(8.3) if-else-if-else语句
注:如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <
# 语法如下
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

#(8.4) 循环语句
#(8.4.1) for循环语法如下
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
# for循环示例,打印1,2,3,4,5
for item in 1 2 3 4 5
do
    echo "$item"
done

#(8.4.2) while循环语句语法
while condition
do
    command
done
# while循环示例,其中let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
value=1
while(( $value<=5 ))
do
    echo $value
    let "value++"
done

#(8.4.3) 无限循环语句语法
while :
do
    command
done
# 或者
while true
do
    command
done
# 或者
for (( ; ; ))

#(8.4.4) until 循环
# 注:until 循环执行一系列命令直至条件为 true 时停止
until condition
do
    command
done
# 示例,输出 0 ~ 5 的数字
a=0
until [ ! $a -lt 5 ]
do
   echo $a
   a=`expr $a + 1`
done

#(8.5) 多分枝选择语句
注:case ... esac 为多选择语句,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记
# 语法如下
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
# 示例
read number  # 阻塞并读取用户输入
case $number in
  1)
  echo "用户输入了$number" ;;
  2)
  echo "用户输入了$number" ;;
  *)
  echo "相当于default执行";;
esac

#(8.6) break和continue
在shell中也是使用break和continue跳出循环,含义与其它编程语言类似

#【9】shell函数
语法与js类似,调用方式稍有不同
# 语法如下
[ function ] funname [()]
{
    action;
    [return int;]
}
注:
1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2.参数返回,可以显示加return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
示例及使用如下

# 在shell脚本中函数必须先定义后使用
# 函数定义如下
usemyshellfun(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
    return $((2+3))
}
# 调用函数并传参
usemyshellfun 1 2 3 4 5 6 7 8 9 34 73
# 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

#【10】shell输入输出重定向
# 将输出重定向到 file
command > file
# 将输入重定向到 file
command < file
# 将输出以追加的方式重定向到 file
command >> file
# 将文件描述符为 n 的文件重定向到 file
n > file
# 将文件描述符为 n 的文件以追加的方式重定向到 file
n >> file
# 将输出文件 m 和 n 合并
n >& m
# 将输入文件 m 和 n 合并
n <& m
# 将开始标记 tag 和结束标记 tag 之间的内容作为输入
<< tag
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
1.标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
2.标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
3.标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

# 将错误流stderr 重定向到 file
command 2>file
# 将错误流stderr 重定向并追加到 file
command 2>>file
# 将输出流stdout 和错误流 stderr 合并后重定向到 file
command > file 2>&1
# 追加方式
command >> file 2>&1
另:/dev/null 文件

# /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到
# 将命令的输出重定向到它,会起到"禁止输出"的效果

# 如果希望执行某个命令,但又不希望在屏幕上显示输出结果
command > /dev/null
# 如果希望屏蔽 stdout 和 stderr
command > /dev/null 2>&1
2. bat命令

bat相关命令和shell命令有异曲同工之妙,而且bat会比shell使用简单点

【1】获取和设置相关变量
bash 复制代码
# 获取常用变量不需要区分大小写,使用%variable%可以获取变量值
# 获取当前目录
echo %cd%
# 获取命令搜索路径
echo %path%
# 获取当前日期
echo %date%    # 格式:2023/03/22 周三
# 获取当前时间
echo %time%  # 格式:14:26:46.97
# 获取 0 和 32767 之间的任意十进制数字
echo %random%
# 获取上一命令执行结果码
echo %errorlevel%

# 变量设置,与shell有所不同,格式如下
set [variable=[string]]  #variable表示变量名,string表示变量值
# 例
set temp="哇哈哈"
echo %temp%  # 输出:"哇哈哈"
【2】字符串操作
bash 复制代码
# 字符串截取,命令格式 echo %var:~n,k%,
# 1."var",表示待截取字符的字符串
# 2."~"取字符标志符
# 3."n"表示字符截取起始位置
# 4."k" 表示截取几位
set temp="wahaha哇哈哈123"
echo %temp:~2,3%  # 输出:hah
echo %temp:~0,-3%  # 输出:wahaha哇哈哈

# 字符串替换,命令格式命令%var:old_str=new_str%
set replace_str=%temp:123=熏悟空%
echo %replace_str%  # 输出:wahaha哇哈哈熏悟空
echo %temp%  # 输出:wahaha哇哈哈123,不改变原值
【3】bat注释
bash 复制代码
rem 注释符,也可以用两个冒号代替(::)
rem 这是一个注释,此注释不会显示
【4】bat输出语句
bash 复制代码
echo 显示信息,或启用或关闭命令回显。@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态
# 批处理命令在执行时显示自身命令行
echo on
# 批处理命令在执行时不显示自身命令行
echo off
# 关闭echo off命令行自身的显示
@echo off
# 创建包含字符test的test.txt文件
echo test > file.txt
【5】基本命令
bash 复制代码
# 暂停并输出"请按任意键继续. . ."
pause 等待并提示"请按任意键继续. . ."  # 阻塞窗口,程序执行完以后不会关闭窗口
pause > nul  # 等待但不出现提示语
echo wait a moment.. & pause > nul # 输出指定信息并阻塞窗口

# 程序执行结果返回码,执行成功返回0,失败返回为1
echo %errorlevel%

# 启动一个单独的窗口以运行指定的程序或命令,程序继续向下执行
start [command/program] [parameters]

# 退出CMD.EXE程序或当前批处理脚本
# 1./B:指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE
# 2.exitCode:指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码
exit [/B] [exitCode]

# 清除屏幕内容
cls

# 提供 Windows 命令的帮助信息
help [command]

# 设置cmd窗口的标题
title 标题名字

# 设置默认的控制台前景和背景颜色
# 颜色属性由两个十六进制数字指定:第一个为背景,第二个则为前景
# 以下任意俩种颜色组合
#   0 = 黑色       8 = 灰色
#   1 = 蓝色       9 = 淡蓝色
#   2 = 绿色       A = 淡绿色
#   3 = 湖蓝色     B = 淡浅绿色
#   4 = 红色       C = 淡红色
#   5 = 紫色       D = 淡紫色
#   6 = 黄色       E = 淡黄色
#   7 = 白色       F = 亮白色
color [attr]  # attr 指定控制台输出的颜色属性

# 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序
call 路径文件名 标签

# 跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序
goto label  # label是参数,指定所要转向的批处理程序中的行
# 例子,打开多个cmd窗口直到资源耗尽
:label
start
goto label
【6】语句结构
bash 复制代码
####
####1.if语句
####
# if语句实现条件判断,包括字符串比较、存在判断、定义判断等。# # 通过条件判断,if语句即可以实现选择功能。
/*
1.字符串比较
  语法格式:if [/i] [not] str1 比较操作符 str2 (相关操作) [else (相关操作)]
  		  有/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非
比较操作符:
  1.== - 等于
  2.EQU - 等于
  3.NEQ - 不等于
  4.LSS - 小于
  5.LEQ - 小于或等于
  6.GTR - 大于
  7.GEQ - 大于或等于
*/
# 例子
set str1=123456
set str2=abcdef
if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
if /i not %str1%==%str2% (echo 字符串不相同!) else (echo 字符串相同!)

/* 
2.存在判断:存在判断的功能是判断文件或文件夹是否存在
  语法格式:if [not] exist filename (相关操作) [else (相关操作)]
*/
# 例子1
if exist %0 echo 文件%0是存在的!  # %0代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型)
# 例子2
if not exist %0(
  echo 文件夹%0不存在!
)else echo 文件夹%0存在!

/*
3.定义判断:定义判断的功能是判断变量是否存在,即是否已被定义
  语法格式:if [not] defined variable (相关操作) [else(相关操作)]
*/
# 例子1
set var=111
if defined var (echo var=%var%) else echo var尚未定义!
# 例子2
set var=% %
if defined var (echo var=%var%) else echo var尚未定义!

####
####2.for循环语句
####
/*
1.无开关:无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句
  语法格式:for %%v in (循环值values)  do (相关操作)
相关解释:
  %%v是批处理程序里面的书写格式,注意v只能是单字符。在DOS中书写为%v,即只有一个百分号(%);values就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的(相关操作)就是循环所执行的命令,即循环体
*/
# 例子1(在脚本文件中)
for %%i in (a,"b c",d,123) do echo %%i
# 例子2(在dos或者cmd窗口中)
for %i in (a,"b c",d,123) do echo %i

/*
2.开关/L:开关/L的for语句,可以根据循环值velues里面的设置进行循环,从而实现对循环次数的直接控制
  语法格式:for /L %%v in (start,step,end) do (相关操作)
相关解释:
  start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。
*/
# 例子1,打印1到10(小于10)步长为2的数字
for /l %%i in (1,2,10) do @echo %%i
# 例子2(在dos或者cmd窗口使用)
for /l %i in (1,2,10) do @echo %i

/*
3.开关/f:开关/f的for语句可以解析字符串和文本
  语法格式:for  /f ["options"] %%v in (循环值values) do (相关操作)
  相关解释:
    options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。
*/

/*
4.开关/D或/R:开关/D或/R的for语句是与目录或文件有关的命令,一般情况下很少使用。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹
*/

五、案例:

1. shell:
【1】Shell脚本: https://zhuanlan.zhihu.com/p/601971378?utm_id=0
【2】109 个实用 shell 脚本,建议收藏!: https://zhuanlan.zhihu.com/p/468003798
2. bat:
【1】图标恢复.bat(解决桌面图标变为白纸的情况)
bash 复制代码
@echo off 
taskkill /f /im explorer.exe 
CD /d %userprofile%\AppData\Local 
DEL IconCache.db /a 
start explorer.exe 
echo 执行完成
【2】清理图标缓存.bat
bash 复制代码
@echooff
color0A
taskkill/f/imexplorer.exe
attrib-h-s-r"%userprofile%\AppData\Local\IconCache.db"
del/f"%us
echo 执行完成
【3】Navicat脚本
bash 复制代码
@echo off
echo Delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration[version and language]
for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium" /s | findstr /L Registration"') do (
    reg delete %%i /va /f
)
echo.
echo Delete Info folder under HKEY_CURRENT_USER\Software\Classes\CLSID
for /f %%i in ('"REG QUERY "HKEY_CURRENT_USER\Software\Classes\CLSID" /s | findstr /E Info"') do (
    reg delete %%i /va /f
)
echo.
echo Finish
pause
相关推荐
Jay Chou why did1 分钟前
wsl安装完无法进入wsl
linux
石头5301 小时前
Rocky Linux 9.6 docker k8s v1.23.17 kubeadm 高可用部署文档
linux
松涛和鸣1 小时前
49、智能电源箱项目技术栈解析
服务器·c语言·开发语言·http·html·php
凉、介1 小时前
SylixOS 中的 Unix Socket
服务器·c语言·笔记·学习·嵌入式·sylixos
RisunJan1 小时前
Linux命令-ipcs命令(报告进程间通信(IPC)设施状态的实用工具)
linux·运维·服务器
春日见2 小时前
控制算法:PP(纯跟踪)算法
linux·人工智能·驱动开发·算法·机器学习
HABuo2 小时前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
oMcLin2 小时前
如何在 Rocky Linux 8.7 上通过 Prometheus 与 Grafana 结合,提升大规模容器环境的监控与性能分析?
linux·grafana·prometheus
橘颂TA2 小时前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁