用脚本记录一下服务器的工作状态(工具人养成第三弹)

服务器从装好,到使用至今,时不时的会莫名其妙的重启,目前一直都没有发现原因。。。

 

首先可以确定的是,电源应该是没有问题的,服务器的TDU插座是4000w的,服务器是2000w的电源,绝对够

那大概率是因为温度过高导致的宕机。

虽然。一方面,我可以通过syslog或者journalctl -xe 来查看系统日志,但是最对只能知道是不是意外重启,也没法得到重启的原因。

另一方面,我虽然我也可以通过sensors来查看系统的温度,不过我也不可能24h盯着看。

 

没办法,我决定通过一个脚本来实现在线用户人数、用户操作、用户内存使用量、CPU温度和GPU温度的记录,这一份代码中有很多参考自网络,由于写的太久了,我也懒得找出处了,如果有小伙伴找到了,可以告诉我,我加在引用里。

 

首先需要在shell脚本中实现 文件夹以及相关txt记录文件的新建

data_fold=$(date +%Y'-'%m'-'%d)
hour_fold=$(date +%Y'-'%m'-'%d'_'%H)
currentdate=$(date +%Y'-'%m'-'%d'_'%H':'%M':'%S)

mkdir -p ./user_and_temp/$data_fold/$hour_fold
touch ./user_and_temp/$data_fold/$hour_fold/cpu_$currentdate.txt
txt_path="./user_and_temp/$data_fold/$hour_fold/cpu_$currentdate.txt"

然后,我们通过脚本记录cpu温度,并记录进txt文件中

CPU0=`sensors  coretemp-isa-0000 | tail -n +4 | tr -s " " | awk -F [°C+] '{print $1$3}'`
CPU1=`sensors  coretemp-isa-0001 | tail -n +4 | tr -s " " | awk -F [°C+] '{print $1$3}'`
temp_zone0=`cat /sys/class/thermal/thermal_zone0/temp`
temp_zone1=`cat /sys/class/thermal/thermal_zone1/temp`

echo "cpu temperature" >> $txt_path
max0=0.0
        for i in $CPU0;do
		# echo $i >> cpu_temp.txt
                if [ ${i%.*} -gt ${max0%.*} ];then
            		max0=$i
                fi
        done
echo "max0" >> $txt_path
echo ${max0%.*} >> $txt_path

echo " ">> $txt_path
max1=0.0
        for j in $CPU1;do
		# echo $j >> cpu_temp.txt
                if [ ${j%.*} -gt ${max1%.*} ];then
            		max1=$j
                fi
        done
echo "max1" >> $txt_path
echo ${max1%.*} >> $txt_path

echo " " >> $txt_path
echo "Package id 0:"  >> $txt_path
echo ${temp_zone0%000} >> $txt_path
echo "Package id 1:" >> $txt_path
echo ${temp_zone1%000} >> $txt_path

这里CPU0和CPU1记录的是sensors统计的CPU各个核的最高温度,而temp_zone0和temp_zone1记录的是系统temp文件中记录的温度

(其实我一直没搞明白,我们的服务器是112个核,为啥sensors只能识别到30个核)

 

之后我们记录一下现在的在线人数

echo "Online users" >> $txt_path
w | while read line
do
echo $line >> $txt_path
done

直接记录,w的返回值是没有分行的一长段,但是这段代码可以实现按行记录,用起来方便很多

顺便记录一下各个用户的内存使用情况

echo "Memory Usage" >> $txt_path
./find_the_bi*ch.sh | tail -n +3  | while read line
do
echo $line >> $txt_path
done

find_the_bi*ch是一段我在网上找到的,统计各个用户内存使用量的代码。参考:查看 Linux 系统中进程和用户的内存使用情况 Linux中国

但是,由于ps的指令只能记录8个字符的用户名,如果用户名高于 8个字符,则会显示前七个,第八个用+代替,这并不适合我的需求。

我原本的计划是,找到内存使用量,高于某个阈值的用户,并通过他的用户名直接kill掉他的进程。这里用户名显示不全,明显不适合我的需求

不过修改后的脚本已经满足了我的需求,修改后的find_the_bi*ch.sh代码如下

#!/bin/bash
stats=””
echo "%   user"
echo "============"
# collect the data
for user in `ps -o ruser=userForLongName -e -o %mem | awk '{print $1}' | sort -u`
do
stats="$stats\n`ps -o ruser=userForLongName -e -o %mem | egrep ^$user | awk 'BEGIN{total=0}; \
{total += $2};END{print total,$1}'`"
done
# sort data numerically (largest first)
echo -e $stats | grep -v ^$ | sort -rn | head

再记录一下用户的进程数

echo "parallel processes" >> $txt_path
ps aux|awk '{a[$1]++}END{for (b in a)print a[b],b}' | sort -rn | while read line
do
echo $line >> $txt_path
done

最后,我们记录一下GPU的使用情况

echo "GPU usage" >> $txt_path
nvidia-smi | awk 'NR==9,NR==10{print}' >> $txt_path
nvidia-smi | awk 'NR==13,NR==14{print}' >> $txt_path
nvidia-smi | awk 'NR==17,NR==18{print}' >> $txt_path
nvidia-smi | awk 'NR==21,NR==22{print}' >> $txt_path

以上的代码是不杀用户进程的版本,如果需要kill内存使用超过一定阈值的用户的进程,请将读取find_the_bi*ch.sh结果的代码改为以下版本

pick_mem=30

./find_the_bi*ch.sh | tail -n +3  | while read line
do
echo $line >> $txt_path

if [ $(echo $line | awk '{print $1}') != "Binary" ];then
	first_char=$(echo $line | awk '{print $1}')
	if [ ${first_char%.*} -gt $pick_mem ];then
		user_name=$(echo $line | awk '{print $2}')
		if [ $user_name != "root" ];then
			echo $user_name
			killall -u $user_name

		fi
	fi
fi

done

如果需要限制用户的进程数,

请通过修改limits.conf文件,设定用户的进程上限

vim /etc/security/limits.conf

比如

Chauncey_wang hard nproc 32
# @student hard nproc 32
# @faculty hard nproc 64

就限制Chauncey_wang这个用户的进程数上限为32个进程。

不过,在此之前,还需要确定一下/etc/pam.d/login文件中下面一行的存在:
session required /lib/security/pam_limits.so

可通过

cat /etc/pam.d/login

来查看。参考:linux限制用户进程数

limits.conf 生效,与pam_limits.so 文件

 

其实我还尝试过通过bypy,直接将记录的文件备份到网盘中,但是不知道什么原因,备份的速度特别慢,最后放弃了这个计划

如果有需要,请参考Linux ubuntu18 bypy 上传文件到百度网盘 定时上传文件百度云

 

最后,相关的代码我已经放在了GitHub中,有需要的小伙伴可以自取。

Ubuntu_Log

Ubuntu_Log_Kill_Processes

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值