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等。
五、性能监视相关的博客
六、一些常见的问题
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
当没有歧义时是可以不用使用中括号的,如果有歧义不适用中括号,那么就会不认识该命令,报错。所以最好不管有没有歧义都是用中括号引用变量。