Linux Shell日常脚本

1,448 阅读3分钟

常用命令

[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))"
20

3、判断nginx进程是否存在,不存在则自动拉起

nginx_process_num=`ps -ef | grep nginx | grep -v grep | wc -l`
if [ $nginx_process_num -eq 0 ] ;then
    systemctl start nginx
fi

4、输入一个正整数,累加输出和

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 {} \;
done

9、监控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"
done

 12、实现进程监控,启动|停止大型脚本

#!/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

done

process.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