Linux常用的脚本

1.巡检脚本

巡检内容如下:
磁盘空间、物理cpu核数,逻辑CPU核数、获取ip地址/主机名称、内存、密码过期检查、nginx服务检查、nacos服务检查、MQ检查、服务检查。

#日常巡检脚本
        #!/bin/bash

        NGINX_IP_="111.11.2.47,111.11.2.16,111.6.0.21,111.16.10.16,192.168.10.114"
        NACOS_IP_="111.11.22.109,111.11.22.108,111.11.22.106,192.168.11.182"
        MYSQL_IP_="111.11.22.1011.2211.11.22.113,111.21.19.155"
        RABBITMQ_IP_="111.11.22.110,111.11.22.111,111.11.22.112"
        MPLATFORM_IP_="111.11.2.142,111.11.2.161,192.168.11.131"



        function color_echo()
        {
        printf "\e[%dm %s\e[0m \n" $1 "$2"
        }

        function echo_separator()
        {
        echo ""
        echo ""
        echo "$1"
        echo "--------------------------------------------------------------------------------------------------"

        }

        #1.检查磁盘空间.
        function check_disk()
        {

        echo_separator "磁盘空间检查"


        THRESH=70
        #root根节点.
        check_root=`df -P /|sed -n '2,$p'|awk -F '( |%)' -v t=$THRESH '{if ($(NF-2)>t){printf("根节点空间不足,fail\n")}}'`
        check_ratio=`df -P /|sed -n '2,$p'|awk '{print $5}'`
        if [ "x$check_root" != "x" ]
        then
        color_echo 31 "$check_root"
        fi
        #/datafile
        check_wwlocal=`df -P /datafile|sed -n '2,$p'|awk -F '( |%)' -v t=$THRESH '{if ($(NF-2)>t){printf("/datafile空间不足,使用率超过了阈值.fail\n")}}'`
        check_datafile_ratio=`df -P /datafile|sed -n '2,$p'|awk '{print $5}'`
        if [ "x$check_wwlocal" != "x" ]
        then
        color_echo 31 "$check_wwlocal"
        fi

        if [ "x$check_root" == "x" -a "x$check_wwlocal" == "x" ]
        then
        color_echo 34  "/根目录磁盘使用率情况:${check_ratio}.  /datafile目录磁盘使用率:${check_datafile_ratio}"
        fi
        }


        #2.物理cpu核数,逻辑CPU核数
        function check_phy_cpu()
        {

        echo_separator "CPU检查"
        phy_cpu=`cat /proc/cpuinfo | grep "physical id"|sort | uniq | wc -l`

        logic_cpu=`cat /proc/cpuinfo | grep "processor"| wc -l`
        if [ "x$phy_cpu" != "x" -a  "x$logic_cpu" != "x" ]
        then
        color_echo 34 "物理CPU核数:${phy_cpu};  逻辑CPU核数:${logic_cpu}."
        fi

        }


        #3.获取ip地址/主机名称
        function get_host_info()
        {

        echo_separator "服务器信息检查"
        ip_addr=`ifconfig | grep "inet"|grep -v "127.0.0.1"|awk -F: '{print $1}'|awk 'NR==1{print}'| awk '{print $2}'`
        hostname=`hostname`
        last_uptime=`who -b|awk '{print $3,$4}'`
        system_time=`date "+%Y-%m-%d %H:%M:%S"`
        os_ver=`cat /etc/redhat-release`
        color_echo 34  "主机名称:${hostname};  IP地址:${ip_addr}.  服务器最后一次重启时间:${last_uptime}. 服务器当前时间:${system_time} . 操作系统版本号: ${os_ver}.          "

        }


        #4.内存大小.
        function check_mem()
        {
        echo_separator "服务器内存间检查"
        MEM_THRESHOLD=80
        mem_total=$(free -m |grep Mem|awk '{print $2}')
        mem_used=$(free -m |grep Mem|awk '{print $3}')
        mem_rate=`awk 'BEGIN{printf "%.5f\n",('$mem_used'/'$mem_total')*100}'`

        mem_gt_threshold=`expr ${mem_rate}\>${MEM_THRESHOLD}`

        if [ ${mem_gt_threshold} == 1 ]
        then
        color_echo 31 "内存使用超过阈值.${MEM_THRESHOLD}"
        else
        color_echo 34 "内存共: ${mem_total}M; 使用了${mem_used}M;使用率:${mem_rate}%."
        fi
        }


        #5.密码过期检查
        function check_passwd {
        echo_separator "密码检查"
        pwdfile="$(cat /etc/passwd)"

        result=""
        for shell in $(grep -v "/sbin/nologin" /etc/shells);do
        for user in $(echo "$pwdfile" | grep "$shell" | cut -d: -f1);do
        get_expiry_date=$(/usr/bin/chage -l $user | grep 'Password expires' | cut -d: -f2)
        if [[ $get_expiry_date = ' never' || $get_expiry_date = 'never' ]];then
        color_echo 34 "永不过期   $user"
        result="$result,$user:never"
        else
        password_expiry_date=$(date -d "$get_expiry_date" "+%s")
        current_date=$(date "+%s")
        diff=$(($password_expiry_date-$current_date))
        let DAYS=$(($diff/(60*60*24)))
        expr_days=`expr $DAYS \* -1`
        #判断是否已经过期
        if [ "$expr_days" -gt "0" ]
        then
        color_echo 31  "$user   已过期$expr_days"
        else
        color_echo 31  "$user   $DAYS天后过期"
        fi
        result="$result,$user:$DAYS days"
        fi
        done
        done
        report_PasswordExpiry=$(echo $result | sed 's/^,//')
        echo_separator "密码检查策略"
        grep -v "#" /etc/login.defs | grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE"

        }


        #检查服务是否启动正常
        function check_service()
        {
        ip_addr=`ifconfig | grep "inet"|grep -v "127.0.0.1"|awk -F: '{print $1}'|awk 'NR==1{print}'| awk '{print $2}'`
        pid=`ps -ef|grep $3|grep -v grep|awk '{print $2}' `
        OLD_IFS="$IFS"
        IFS=","
        arr=($1)

        IFS="$OLD_IFS"
        for ip in ${arr[@]}
        do
        if [ "${ip}" == "${ip_addr}" ]
        then
        echo_separator "$3 服务检查"
        if [ -z "${pid}" ]
        then
        color_echo 31 "$2 未启动."
        else
        color_echo 34 "$2 服务正常."
        fi
        fi
        done

        }

        #nginx服务检查
        function check_nginx()
        {
        check_service "$NGINX_IP_"  "nginx" "nginx"
        }


        #nacos服务检查
        function check_nacos()
        {
        check_service "$NACOS_IP_" "nacos" "nacos"
        }

        #mysql服务检查
        function check_mysql()
        {
        check_service "$MYSQL_IP_" "MYSQL" "mysql"
        }

        #mq服务检查
        function check_rabbitmq()
        {
        check_service "$RABBITMQ_IP_" "RABBITMQ" "rabbitmq"
        }

        #服务检查
        function check_mservice()
        {
        check_service "$MPLATFORM_IP_" "测试服务" "mservice"
        }


        get_host_info
        check_disk
        check_phy_cpu
        check_mem
        check_passwd
        check_nginx
        check_nacos
        check_mysql
        check_rabbitmq
        check_mservice

2. 前端部署脚本

包含从ftp拉取压缩包,并备份解压功能。

#!/bin/bash

PARAM_NUM=$#
zip_name=$1
DIST_REAL_NAME=$2
#BAK_TIME=$(date +%F%n%T)
BAK_TIME=$(date +%Y%d%m%H%M%S)
#前端目录所在路径
#CATALOG_PATH=/nginx/nginx/wwwlocal

function color_echo()
{
    printf "\e[%dm %s\e[0m \n" $1 "$2"
}

bakDistFile()
{
#首先判断参数是否正常.总共需要输入2个参数.
if [ $PARAM_NUM -ne "2" ];
then
    usage
    exit
 else
    test_prod
    ftp_get
    bakFile
fi
}

#首先判断输入名称是否正确
usage(){
 color_echo 34 "使用说明:该脚本有两个参数,第一个参数是上传的压缩包名如:dist.zip,第二个参数是实际服务名如:vue-service"
}

#$2在目录下是否存在,如果不存在重建一个即可,如果存在需要备份,并删除原有目录。
bakFile(){
  if [[ -d "$CATALOG_PATH/$DIST_REAL_NAME" ]]; then
     mv_unzip_file
  else
   color_echo 31 "请仔细检查确认,前端服务名称是否正确.如确认无误请输入y/Y,回车确认.否则输入n/N,退出."
     while true
   do
    read -r -p  " 请确认, [Y/n] " input

    case $input in
        [yY][eE][sS]|[yY])
                mv_unzip_file
               exit 1
        ;;
        [nN][oO]|[nN])
           color_echo 34 "No,确认后再次执行该脚本."
           exit 1           
           ;;
        *)
           color_echo 31 "Invalid input..."
           ;;
    esac
     done
  fi
}

mv_unzip_file()
{

   mv -f $zip_name $CATALOG_PATH
   cd $CATALOG_PATH
   #目录存在,拉取后先备份
   mv  $DIST_REAL_NAME "$DIST_REAL_NAME-$BAK_TIME.bak"
   #判断下压缩包类型
   if [ ${zip_name##*.} == "zip" ];then
     unzip  $zip_name  && mv `unzip -l $zip_name | awk '{if(NR == 4){ print $4}}'` $DIST_REAL_NAME 
   elif [ ${zip_name##*.} == "gz" ] || [ ${zip_name##*.} == "tgz" ];then
      mkdir ./$DIST_REAL_NAME && tar -xzvf $zip_name  -C ./$DIST_REAL_NAME  --strip-components 1
   else
     color_echo 31 "请确认上传ftp的压缩包类型,目前仅支持zip、gz.";      
   fi

}

test_prod()
{
ifconfig | grep "inet" | grep -v "inet6" |awk '{ print $2 }'| sed 's/addr://g'| grep -v "127.0.0.1" | head -1 |grep 192.168  >/dev/null

if [ $? == 0 ];then
        FADDR='215.12.116.19'
        FTPADDR='215.12.116.19 6000'
        FTPUSER='test test'
else
        FADDR='215.42.30.47'
        FTPADDR='215.42.30.47 6000'
        FTPUSER='test test@123'
fi
}


ftp_get()
{
ftp -n << EOF
 open ${FTPADDR}
 user ${FTPUSER}
 bin
 get ${zip_name}
 clos
 bye
EOF

}

bakDistFile

3.后端部署脚本

jar替换yml文件,启停功能。

#!/bin/bash
#jar包名称
APP_NAME=springboot-service.jar
BOOT_INF_PATH=BOOT-INF/classes
#检查程序是否在运行

usage(){
echo "sh start_mplatform.sh start 启动进程"
echo "sh start_mplatform.sh stop 杀掉进程"

}
is_exist(){
 pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
 #如果不存在返回1,存在返回0
 if [ -z "${pid}" ]; then
 return 1
 else
 return 0
 fi
}
#启动方法
start(){
 is_exist
 if [ $? -eq "0" ]; then
         echo "${APP_NAME} is already running. pid=${pid} ."
 else
    #获取到当前yml在jar包中的位置
 
    ymlBootPath=`jar tvf ${APP_NAME}|grep bootstrap.yml`
    # ${var%/*}:去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容.
    #解压指定路径下的文件   ${ymlPath##* }:## 号截取,删除左边字符,保留右边字符
    jar xvf ${APP_NAME} ${ymlBootPath##* }
    #复制yml到jar包里
    cp -arpf  resources/bootstrap.yml $BOOT_INF_PATH
    #把更新完毕的文件放回jar包中去
     jar uvf $APP_NAME ${ymlBootPath##* }
  
    echo "        The YML configuration file in jar package is replaced.start startup jar.           "
     rm -rf BOOT-INF
     nohup java -Xms1024m -Xmx2048m -XX:+PrintGCDetails  -XX:+PrintGCDateStamps -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m  -jar  $APP_NAME > /user/local/logs/springboot-out.log 2>&1 &        
  tail -f /user/local/logs/springboot-out.log
 fi
}


#停止方法
stop(){
 is_exist
 if [ $? -eq "0" ]; then
    echo "$APP_NAME 运行进程id: $pid"
     sudo  kill  -9  $pid
 else
 echo "${APP_NAME} stop success"
 fi
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
   "start")
    start
  ;;
   "stop")
    stop
 ;;
*)
 usage
 ;;
esac

5.新建用户脚本

#!/bin/bash
 
# 需要创建的用户名,示例:USER_NAME=myuser
USER_NAME=$1
# 创建用户所属的用户组,示例:USER_GROUP=mygroup
USER_GROUP=$2
# 用户密码,示例:USER_PASSWD=Cloud12#$
USER_PASSWD=$3
 
function color_echo()
{
    printf "\e[%dm %s\e[0m \n" $1 "$2"
}

# 校验参数
function check_param()
{
    if [[ ! -n "${USER_NAME}" ]] || [[ ! -n "${USER_GROUP}" ]] || [[ ! -n "${USER_PASSWD}" ]]; then
        color_echo 31 "ERROR: 该脚本需要三个参数,分别是:用户名、所属组、密码;且全不为空."
        exit 1;
    fi
}
 
# 创建用户
function creat_user()
{
    check_param
   echo "用户名:$USER_NAME;---所属组:$USER_GROUP; 密码:$USER_PASSWORD。"
    #create group
    grep "^${USER_GROUP}" /etc/group &> /dev/null
    if [ $? -ne 0 ]; then
        groupadd ${USER_GROUP}
    fi
    #create user
    id ${USER_NAME} &> /dev/null
    if [ $? -ne 0 ]; then
        useradd -g ${USER_GROUP} ${USER_NAME} -d /home/${USER_NAME}
        echo ${USER_PASSWD}| passwd ${USER_NAME} --stdin
        chage -M 99999 ${USER_NAME}
    fi
}

creat_user $*
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容