【Linux脚本】Linux性能检测脚本

本文详细介绍了Linux脚本的基础命令,如变量操作、进程PID获取、管道通信、awk处理CSV、内存监控指标(VSS/RSS)以及进阶的性能监视脚本示例,包括文件描述符、内存使用、CPU占用率的测量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux脚本

一、基础命令

1.1 变量

和python一样

process_name="cWosInterfaceDB"

1.2 取变量

$process_name

1.3 取进程的pid

  • grep
  • pgrep
  • pidof

最好使用pgrep而不使用grep,是因为使用grep查找线程的命令如下:

ps -ef|grep $process_name

这样找出来的信息不仅有pid的信息,而且还有时间等其他信息。另外还会找到grep的一个进程,需要进一步筛选。而是用pgrep的命令如下:

pgrep $process_name

也可使用pidof

pidof $process_name

1.4 | 管道通信符

表示前一个命令的输出是下一个命令的输入

pgrep $process_name |xargs -I{} cat /proc/{}/status

其中

xargs -I{}

表示把上一个命令输入给下一个命令的值用{}代替。比如这里的第一个命令是获取$process_name的pid,会将pid传入给下一个命令,最为下一个命令的输入,下一个命令会用{}来接收,然后cat打开/proc/{}/status文件,等价于打开的文件就是/proc/6880/status。

1.5 获取进程的状态

也就是1.4中的命令。

pgrep $process_name |xargs -I{} cat /proc/{}/status

该命令可以获取到进程的Name,umask,pid,

1.6 awk

awk用于操作csv文件

默认空格为列分隔符,下面命令表示输出或者获取第二列的内容

awk '{print $2}' 文件名

设置列分隔符为#

awk -F '#' '{print $2}' 文件名

如果要输出某行某列的数据,下面命令表示,以#为列分隔符,输出文件第一行(NR==1)第二列($2)的数据。

awk -F "#" 'NR==1{print $2}' 文件名

1.7 统计行数

wc -l 文件名

如果通过管道通信符|

xxx |wc -l

会统计前一个命令的输出有多少行。

二、常用缩写含义

2.1 VSS、RSS、PSS、USS

在这里插入图片描述

一般关心的就是RSS和VSS。

通过top或者pmap可以获取到RSS和VSS

2.1.1 通过top获取

在这里插入图片描述

2.1.2 通过pmap获取

语法

pmap -x pid

在这里插入图片描述

在这里插入图片描述

三、进阶——Linux性能监视脚本

注意使用时,必须要创建存储csv文件的路径,不需要创建该csv文件。

# 定义映射进程名的变量
p。rocess_name="监视的进程名"
# 定义监视结果写入的csv文件名与绝对路径
csv_file_date=${date +"%Y-%m-%d_%H_%M_%S"}
# 注意使用时,必须要创建该路径,不需要创建该csv文件
csv_file="/root/monitor_mem_report/test_linux_${csv_file_date}.csv"
echo "${csv_file}"
# 获取cpu核数
cup_cout=$(grep -c 'processor' /proc/cpuinfo)
# 写表头
if [! -f $csv_file];then
	echo "current_time,FDSize,process_handle,unit,working_set,virtual_bytes,threads_in_p,virtual_bytes_in_p,pysical_mem_in_p,data_segment_in_p,cpu_used_in_p,sys_cpu_used">>$csv_file
fi

#循环写入监视的数据
while true;
do
	#获取时间戳
	timestamp=$(data +%s%3N)
	current_time=$(date -d @$(($timestamp/1000)) "+%m/%d/%Y %H:%M:%S").$(($timestamp % 1000))
	#获取允许的最大文件描述符
	FDSize=${pgrep $process_name |xargs -I {} cat /proc/{}/status |grep "FDSize" |awk '{print $2}'}
	#获取当前有多少个文件描述符
	fd_count=${pgrep $process_name |xargs -I {} ls /proc/{}/fd |wc -l}
	#获取内存单位——kb
	unit=$(pmap -x $(pidof %process_name) | grep total |awk '{print $2}')
	#获取VSS——虚拟内存的大小
	working_set=$(pmap -x $(pidof $process_name) |grep total |awk '{print $3}')
	#获取RSS——物理内存的大小
	virtual_bytes=$(pmap -x $(pidof $process_name) |grep total |awk '{print $4}')
	#获取dirty——脏页的大小,内存——>磁盘的那部分
	private_bytes=$(pmap -x $(pidof $process_name) |grep total |awk '{print $5}')
	#获取线程数量
	proc_thread=$(pgrep $process_name |xargs -I {} cat /proc/{}/status |grep "Threads"|awk '{print $2}')
	#获取现在进程正在占用的虚拟内存
	proc_VmSize=$(pgrep $process_name |xargs -I {} cat /proc/{}/status |grep "VmSize"|awk '{print $2}')
	#获取现在进程正在使用的物理内存
	proc_VmRss=$(pgrep $process_name |xargs -I {} cat /proc/{}/status |grep "VmRss"|awk '{print $2}')
	#获取进程数据段的大小
	proc_VmData=$(pgrep $process_name |xargs -I {} cat /proc/{}/status |grep "VmData"|awk '{print $2}')
	#获取进程的cpu占用率
	proc_cpu=$(top -b -n 1 -p $(pidof $process_name) |grep $process_name |awk '{print $9}') 
	#获取系统的cpu占用率(单核)
	system_avg_cpu=$(top -b -n 1 | grep "Cpu(s)" |awk '{print $2 + $4}')
	#获取系统的总共的cpu占用率
	system_cpu=$(echo "$cpu_count * $system_avg_cou" |bc)
	
	#将统计的数据写入csv文件
	echo "$current_time,$FDSize,$fd_count,$unit,$working_set,$virtual_bytes,$private_bytes,$proc_thread,$proc_VmSize,$proc_VmRss,$proc_VmData,$proc_cpu,$system_cpu">>$csv_file
	#睡眠一秒
	sleep(1)
done

四、性能监视相关的博客

优化后的监视脚本可以在控制台输入需要监视的进程pid和输出的监视报告的文件名

# 控制台输入的第一个参数为需要监视程序的进程号pid,通过ps -ef|grep 进程名  可以查看进程的pid
proc_pid=$1
# 控制台第二个参数表示输出的性能监视文件的名字
csv_file_name=$2
# 定义监视结果写入的csv文件名与绝对路径
csv_file_date=${date +"%Y-%m-%d_%H_%M_%S"}
# 注意使用时,必须要创建该路径,不需要创建该csv文件
csv_file="/root/monitor_mem_report/${proc_pid}_test_linux_${csv_file_name}_${csv_file_date}.csv"
echo "${csv_file}"
# 获取cpu核数
cup_cout=$(grep -c 'processor' /proc/cpuinfo)
# 写表头
if [! -f $csv_file];then
	echo "current_time,FDSize,process_handle,unit,working_set,virtual_bytes,threads_in_p,virtual_bytes_in_p,pysical_mem_in_p,data_segment_in_p,cpu_used_in_p,sys_cpu_used">>$csv_file
fi


#循环写入监视的数据
while true;
do
	#获取时间戳
	timestamp=$(data +%s%3N)
	current_time=$(date -d @$(($timestamp/1000)) "+%m/%d/%Y %H:%M:%S").$(($timestamp % 1000))
	#获取允许的最大文件描述符
	FDSize=${cat /proc/${proc_pid}/status |grep "FDSize" |awk '{print $2}'}
	#获取当前有多少个文件描述符
	fd_count=${ls /proc/${proc_pid}/fd |wc -l}
	#获取内存单位——kb
	unit=$(pmap -x ${proc_pid} | grep total |awk '{print $2}')
	#获取VSS——虚拟内存的大小
	working_set=$(pmap -x ${proc_pid} |grep total |awk '{print $3}')
	#获取RSS——物理内存的大小
	virtual_bytes=$(pmap -x ${proc_pid} |grep total |awk '{print $4}')
	#获取dirty——脏页的大小,内存——>磁盘的那部分
	private_bytes=$(pmap -x ${proc_pid} |grep total |awk '{print $5}')
	#获取线程数量
	proc_thread=$(cat /proc/${proc_pid}/status |grep "Threads"|awk '{print $2}')
	#获取现在进程正在占用的虚拟内存
	proc_VmSize=$(cat /proc/${proc_pid}/status |grep "VmSize"|awk '{print $2}')
	#获取现在进程正在使用的物理内存
	proc_VmRss=$(cat /proc/${proc_pid}/status |grep "VmRss"|awk '{print $2}')
	#获取进程数据段的大小
	proc_VmData=$(cat /proc/${proc_pid}/status |grep "VmData"|awk '{print $2}')
	#获取进程的cpu占用率
	proc_cpu=$(top -b -n 1 -p ${proc_pid} |grep ${proc_pid} |awk '{print $9}') 
	#获取系统的cpu占用率(单核)
	system_avg_cpu=$(top -b -n 1 | grep "Cpu(s)" |awk '{print $2 + $4}')
	#获取系统的总共的cpu占用率
	system_cpu=$(echo "$cpu_count * $system_avg_cou" |bc)
	
	#将统计的数据写入csv文件
	echo "$current_time,$FDSize,$fd_count,$unit,$working_set,$virtual_bytes,$private_bytes,$proc_thread,$proc_VmSize,$proc_VmRss,$proc_VmData,$proc_cpu,$system_cpu">>$csv_file
	#睡眠一秒
	sleep(1)
done

执行命令:

#脚本文件名 pid 监视报告名
./pert.sh 11199  test_linux

监视报告名不用跟后缀,如csv等。

五、性能监视相关的博客

  1. Linux性能监控

  2. [Linux]常用性能分析命令

在这里插入图片描述

六、一些常见的问题

6.1变量名和等号见不能有空格

如下:

#正确
proc_pid=$1
#错误
proc_pid =$1

6.2 引用变量,最好加中括号{}

如下:

#正确
/${proc_pid}_test_linux_${csv_file_name}_${csv_file_date}

#错误
/$proc_pid_test_linux_csv_file_name_csv_file_date

当没有歧义时是可以不用使用中括号的,如果有歧义不适用中括号,那么就会不认识该命令,报错。所以最好不管有没有歧义都是用中括号引用变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆得儿不是猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值