常用命令
[root@VM_0_10_centos zhangjie]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 2117320 637752 20192944 0 0 43 87 2 1 2 1 97 1 0
vmstate#虚拟内存统计
procs:
r: 运行队列中的线程数
b:
[root@localhost gaofenshuo]# uptime
14:46:55 up 15 days, 5:46, 4 users, load average: 0.66, 0.77, 0.76
14:46:55 - 系统当前时间
15 days, 5:46 - 系统运行时长
4 users - 当前系统在线用户
load average: 0.66, 0.77, 0.76
- 平均负载:0.66, 0.77, 0.76 - 1分钟,5分钟,15分钟内的系统负载超过20则系统负载严重
系统负载:特定时间间隔内运行队列中的线程数
Shell脚本
1、格式化当前的日期
echo "`date "+%Y-%m-%d %H:%M:%S"`"
2019-08-07 14:17:59
2、今年还剩多少个星期
echo "$(((365-`date +%j`)/7))"
203、判断nginx进程是否存在,不存在则自动拉起
nginx_process_num=`ps -ef | grep nginx | grep -v grep | wc -l`
if [ $nginx_process_num -eq 0 ] ;then
systemctl start nginx
fi4、输入一个正整数,累加输出和
while true
do
read -p "请输入一个正整数:" num
expr $num + 1 &> /dev/null
if [ $? -eq 0 ] ;then
if [ `expr $num \> 0 ` -eq 1 ] ;then
for((i=1;i<=$num;i++))
do
sum=`expr $sum + $i`
done
echo "1+2+3+...+$num=$sum"
exit
fi
fi
echo "非法输入"
continue
done
5、nginx监控脚本,如果nginx服务宕机,则该脚本可以检测到并将进程启动
#!/bin/bash
#
# 过滤自身启动的进程
this_pid=?
# 开启守护进程
while true
do
# 查询是否存在nginx进程 $? = 0 表示存在 1 表示不存在
ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -eq 0 ] ;then
echo "Nginx is running well"
sleep 3
else
systemctl start nginx
echo "Nginx is down,Start it...."
fi
done
6、实现一个简单版整数计算器
#!/bin/bash
#
function calcu
{
case $2 in
+)
echo "`expr $1 + $3`"
;;
-)
echo "`expr $1 - $3`"
;;
*)
echo "`expr $1 \* $3`"
;;
/)
echo "`expr $1 / $3`"
;;
esac
}
calcu $1 $2 $3
7、简单函数库-系统负载情况
#!/bin/bash
#
function sys_load
{
echo "系统内存使用情况"
echo
free -m
echo
echo "系统磁盘使用情况"
df -h
}
# 一般定义函数库以.lib为后缀名
# 命令行调用如下
. base_fun.lib
sys_load
系统内存使用情况
total used free shared buff/cache available
Mem: 2827 269 2233 9 325 2349
Swap: 2047 0 2047
系统磁盘使用情况
文件系统 1M-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17394 12314 5081 71% /
devtmpfs 1403 0 1403 0% /dev
tmpfs 1414 0 1414 0% /dev/shm
tmpfs 1414 10 1405 1% /run
tmpfs 1414 0 1414 0% /sys/fs/cgroup
/dev/sda1 1014 220 795 22% /boot
tmpfs 283 0 283 0% /run/user/0
8、定期删除超过7天的系统日志文件
#!/bin/bash
#
while true
do
# 每天检查一次
sleep 24h
# 定位到日志文件目录
log_dir=/var/log
# 删除文件
find $log_dir -mtime +7 -exec rm -rf {} \;
done9、监控jira进程,异常则发送告警信息
#!/bin/bash
#
# 每分钟检查jira进程是否启动,否则发送告警信息
this_pid=?
function sendWxText
{
token=`curl -s 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=企业微信key&corpsecret=企业微信Screct' | grep -Po 'access_token[":]+\K[^"]+'`
curl -v -H 'Content-Type:application/json' -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token" -d '{ "toparty":"2", "totag":"1", "msgtype":"text", "agentid":1000004, "text":{"content":"'$1'"}}'
}
this_pid=?
while true
do
ps -ef | grep jira | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -ne 0 ] ;then
sendWxText Jira已停止运行
fi
sleep 60
done
10、统计mysql配置文件每项字段个数
#!/bin/bash
#
file_path=/root/my.cnf
function get_all_segment
{
echo `sed -n '/^\[.*\]$/p' $file_path | sed -e 's/\[//g' -e 's/\]//g'`
}
function count_items_in_segment
{
items=`sed -n '/^\['$seg'\]$/,/^\[.*\]$/p' $file_path | grep -v '^$' | grep -v '^#' | grep -v '^\[.*\]$'`
count=0
for item in $items
do
count=`expr $count + 1`
done
echo $count
}
index=0
for seg in `get_all_segment`
do
index=`expr $index + 1`
sum=`count_items_in_segment $seg`
echo "$index : $seg $sum"
done12、实现进程监控,启动|停止大型脚本
#!/bin/bash
#
# Func: Get Process Status In process.cfg
main_dir="/root/lesson"
config_file="process.cfg"
this_pid=?
# 获取进程组名列表
function get_all_group
{
G_LIST=`sed -n '/^\[GROUP_LIST\]$/,/^\[.*\]$/p' "$main_dir/$config_file" | grep -v '^\[' | grep -v '^$'`
echo $G_LIST
}
# 判断进程组名是否在配置文件中
function is_group_in_config
{
for item in `get_all_group`
do
if [ "$item" == "$1" ] ;then
return
fi
done
echo "$1 not in process.cfg"
return 1
}
# 根据进程组名获取所有的进程名列表
function get_all_process_by_group
{
is_group_in_config $1
if [ $? -eq 0 ] ;then
process_list=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' "$main_dir/$config_file" | egrep -v '(^$|^\[)'`
echo $process_list
else
echo "$1 is not exist in config"
fi
}
# 获取所有进程名列表
function get_all_process
{
for group in `get_all_group`
do
for process in `get_all_process_by_group $group`
do
echo $process
done
done
}
# 根据进程名获取pid
function get_process_pid_by_name
{
if [ $# -ne 1 ] ;then
return 1
else
pids=`ps -ef | grep $1 | grep -v grep | grep -v $0 | awk '{print $2}'`
echo $pids
fi
}
# 根据PID获取进程信息
function get_process_info_by_pid
{
if [ `ps -ef | awk -v pid=$1 '$2==pid{print $0}' | wc -l` -eq 0 ] ;then
pro_status="STOP"
else
pro_status="RUNNING"
fi
pro_cpu=`ps aux | awk -v pid=$1 '$2==pid{print $3}'`
pro_mem=`ps aux | awk -v pid=$1 '$2==pid{print $4}'`
pro_start_time=`ps -p $1 -o lstart | grep -v STARTED`
}
# 根据进程名获取进程组名
function get_group_by_process_name
{
for gn in `get_all_group`
do
for pc in `get_all_process_by_group $gn`
do
if [ $1 == $pc ] ;then
echo "$gn"
fi
done
done
}
# 判断进程名是否在组内
function is_process_in_config
{
for pc in `get_all_process`
do
if [ $pc == $1 ];then
return
fi
done
return 1
}
# 格式化输出信息
function format_print
{
ps -ef | grep $1 | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -eq 0 ] ;then
pids=`get_process_pid_by_name $1`
for pid in $pids
do
get_process_info_by_pid $pid
awk -v p_id=$pid \
-v p_name=$1 \
-v g_name=$2 \
-v p_status=$pro_status \
-v p_cpu=$pro_cpu \
-v p_mem=$pro_mem \
-v p_start_time="$pro_start_time" \
'BEGIN{printf "%-6s%-15s%-8s%-10s%-6s%-6s%-15s\n",p_id,p_name,g_name,p_status,p_cpu,p_mem,p_start_time}'
done
else
awk -v p_name=$1 -v g_name=$2 'BEGIN{printf "%-6s%-15s%-8s%-10s%-6s%-6s%-15s\n","NULL",p_name,g_name,"STOP","NULL","NULL","NULL"}'
fi
}
# 根据进程名停止运行
function stop_by_process_name
{
is_process_in_config $1
if [ $? -eq 0 ] ;then
description=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' $main_dir/$config_file | awk 'BEGIN{FS="="}/description/{print $2}'`
program_name=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' $main_dir/$config_file | awk 'BEGIN{FS="="}/program_name/{print $2}'`
echo "$description is stopping~"
systemctl stop $program_name
fi
}
# 根据进程名启动
function start_by_process_name
{
is_process_in_config $1
if [ $? -eq 0 ] ;then
description=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' $main_dir/$config_file | awk 'BEGIN{FS="="}/description/{print $2}'`
program_name=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' $main_dir/$config_file | awk 'BEGIN{FS="="}/program_name/{print $2}'`
param=`sed -n '/^\['$1'\]$/,/^\[.*\]$/p' $main_dir/$config_file | awk 'BEGIN{FS="="}/param/{print $2}'`
echo "$description is running~"
$program_name $param
fi
}
function main
{
if [ ! -e $main_dir/$config_file ] ;then
echo "$config_file is not exist..Please Check.."
exit 1
fi
awk 'BEGIN{printf "%-6s%-15s%-8s%-10s%-6s%-6s%-15s\n","PID","PROCESS","GROUP","STATUS","CPU","MEM","START_TIME"}'
if [ $# -gt 0 ] ;then
if [ "$1" == "-g" ] ;then
shift
for gn in $@
do
is_group_in_config $gn || continue
for process in `get_all_process_by_group $gn`
do
is_process_in_config $process && format_print $process $gn
done
done
else
for process in $@
do
gn=`get_group_by_process_name $process`
is_process_in_config $process && format_print $process $gn
done
fi
else
for process in `get_all_process`
do
gn=`get_group_by_process_name $process`
is_process_in_config $process && format_print $process $gn
done
fi
}
while true
do
echo
echo
read -p "选择操作(C-进入停止进程选项|O-进入启动进程选项|S-查看进程列表|Q-退出脚本): " flag
case $flag in
Q)
exit
;;
C)
echo
echo
read -p "请输入进程名(多个空格隔开):" pro_list
for pro in "$pro_list"
do
stop_by_process_name $pro
done
;;
O)
echo
echo
read -p "请输入进程名(多个空格隔开):" pro_list
for pro in "$pro_list"
do
start_by_process_name $pro
done
;;
S)
echo
echo
read -p "请输入查询模式(-g WEB DB|nginx):" params
main $params
;;
*)
echo "输入操作字符错误~请重新输入"
;;
esac
doneprocess.cfg配置文件如下:
[GROUP_LIST]
WEB
DB
HADOOP
YARN
[WEB]
nginx
httpd
[DB]
mysql
postgresql
oracle
[HADOOP]
datanode
namenode
journalnode
[nginx]
description="nginx web server"
program_name=nginx
param=
[httpd]
description="httpd web server"
program_name=tail
param=-f /root/lession/nohup.out