美文网首页
三、日常运维脚本编写一些技巧

三、日常运维脚本编写一些技巧

作者: 妄语莫言 | 来源:发表于2018-08-15 11:52 被阅读0次

    一、查询服务端口号
    1、在本机查询服务的端口号

    MYSQL_PORT=`ss -nutlp|grep $MYSQL_DEFAULT|grep mysql|awk '{print $5}'|awk -F ":" '{print $2}'`
    

    定义变量用大写以防止和默认的系统变量冲突,$MYSQL_DEFAULT设置默认的服务端口好,这里赋值给变量的是一段命令的输出结果,因此需要加上命令执行符号``
    2、获取远程主机的服务端口号

    REDIS_PORT=`ssh root@$SERVER2 "ss -nutlp|grep $REDIS_DEFAULT|grep redis-server|tr -s ' '|cut -d' ' -f5|cut -d: -f2"`
    

    由于awk远程调用涉及到转义的问题,因此远程调用不使用awk命令改用cut,先用tr -s ' '去除输出结果中重复的空白符只保留一个,然后分贝利用空格及冒号进行切割,最后获取需要的端口号

    二、查询服务的进程号PID
    1、在本机根据服务名使用ps -ef查询

    MYSQL_PID=`ps -ef|grep mysql|grep -v grep|grep root|awk '{print $2}'`
    

    使用pgrep命令查询

    pgrep -f tomcat
    

    2、查询远程主机服务的PID

    SOLR_PID=`ssh root@$SERVER2 "netstat -anp|grep $SOLR_DEFAULT|tr -s ' '|cut -d' ' -f7|cut -d/ -f1"`
    

    除了使用ps -ef命令还可以使用netstat根据端口号获取服务对应的PID
    $SERVER2是定义的远程主机IP的变量

    三、通过端口号判断服务是否启动

    if test -z $MYSQL_PORT;then
            echo "Service mysql is not started"     
            echo -e "Commond:\n/etc/init.d/mysql start|restart|stop"
    else
            echo -e "Mysql is already started,\n port:$MYSQL_PORT pid:$MYSQL_PID"
    fi
    

    通过if的条件判断,$MYSQL_PORT为通过命令获取的端口号,如果服务没启动,变量值一般为空,利用test -z进行判断.

    四、多个并列条件判断是否启动服务
    tomcat启动函数,启动条件是7项服务同时已开启,tail -f查看启动日志

    function start_tomcat()
    {
            if [[ $MYSQL_PORT -eq 3306 ]] && [[ $MONGODB_PORT -eq 27017 ]] && [[ $NGINX_PORT -eq 80 ]] && [[ $VSFTP_PORT -eq 21 ]] && [[ $SOLR_PORT -eq 8983 ]] && [[ $REDIS_PORT -eq 6379 ]] && [[ $ACTIVEMQ_PORT -eq 61616 ]] && [[ $S2TOMCAT_PORT -eq  8080 ]];then
                    echo "Start tomcat...."
                    $S1TOMCAT_INSTALL_DIR/bin/catalina.sh start
                    echo "New tomcat process pid is: `ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`" 
                    read -p "Would you need to check start logs now? (y/n)?:"  i
                    if [[ $i = y ]];then
                            tail -f $S1TOMCAT_INSTALL_DIR/logs/catalina.out
                    elif [[ $i = n ]];then
                            echo "Thanks to use,See you next time. Bye!"
                            exit
                    else
                            echo "You need enter y or n, Bye"
                    fi
            else
                    echo "Check your system,Some Services are not started"
            fi
    }
    

    五、根据端口号判断服务是否启动,已启动判断是否重启,否则直接启动
    这里直接调用了上面写的启动函数

    if [[ $S1TOMCAT_PORT -eq 8080 ]];then
            echo "Tomcat is already start !"
            echo "Service tomcat pid is:$S1TOMCAT_PID"
            read -p "Would you need to restart tomcat (y/n)?:"  i
                    if [[ $i = y ]];then
                            echo "Kill tomcat process $S1TOMCAT_PID"
                            kill -9 $S1TOMCAT_PID
                            start_tomcat
                    elif [[ $i = n ]];then
                            echo "Thanks to use,See you next time. Bye!"
                            exit
                    else
                            echo "You need enter y or n, Try to run script again!"
                            exit
                    fi
    else
            start_tomcat
    fi
    

    六、使用tar命令打包项目目录时去除无用的上级子目录
    初始打包命令,将信项目目录打包到/script目录下并命名为app.tar.gz

    tar -czvf  /script/app.tar.gz /usr/local/tomcat/webapps/web/ServiceHot/
    

    打包完成后解压发现解压的是usr目录,打包时候将项目的上级路径也带进来了
    解决方法
    切换到项目目录的上级目录进行打包

    [root@localhost script]# cd /usr/local/tomcat/webapps/web/
    [root@localhost web]# ll
    总用量 4
    drwxr-xr-x 10 root root 4096 7月   7 14:29 ServiceHot
    [root@localhost web]# tar -czvf /script/app.tar.gz  ServiceHot/
    

    七、获取本机的IP地址
    前提:一般针对单网卡的服务器
    配置文件位置/etc/sysconfig/network-scripts/ifcfg-eno16777736
    获取命令

    ifconfig|grep inet|grep -v inet6|grep -v 127|sed 's/^[ \t]*//g'|cut -d ' ' -f2
    

    一般centos7以上的版本没有ifconfig命令,可以安装网络工具包yum install -y net-tools>>/dev/null
    yum命令后面加>>/dev/null表示把安装时的信息丢入黑洞,这样达到静默安装的效果
    同理

    kill -9  $TOMCAT_PID &>/dev/null
    

    利用PID杀掉进程时候前面加&表示无论命令执行结果是什么都不显示,如果进程存在是没有反馈的否则会有报错信息

    [root@localhost opt]# ps -ef|grep tomcat
    root       2524      1  1 17:18 pts/0    00:01:38 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.security.egd=file:/dev/./urandom -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
    root       3269   2295  0 19:18 pts/0    00:00:00 grep --color=auto tomcat
    [root@localhost opt]# kill -9 2524
    [root@localhost opt]# kill -9 88999
    -bash: kill: (88999) - 没有那个进程
    [root@localhost opt]# kill -9 88999 &>/dev/null
    

    八、获取当前系统时间
    如打包脚本定义文件时候APP_BAK_FILENAME=ServiceHot$(date +%Y%m%d).tar.gz

    九、使用scp命令在主机之间相互推送拉取文件
    一般是需要输入对方主机密码,为了方便脚本执行一般在主机之间做ssh互信免密登录
    1、从别的主机上拉取文件到本机的指定目录,这里都已经通过变量做好定义

    scp root@$MASTER_IP:$APP_BAK_DIR/$APP_BAK_FILENAME    $APP_BAK_DIR
    

    2、从本机推送文件到对方主机的指定目录

    scp  $SCRIPT_DIR/$MINION_UPDATE_FILENAME   root@$line:$SCRIPT_DIR
    

    十、使用while命令循环读取文件每行内容并进行对应的操作
    脚本示例如下:

    while read line
    do
    if test -z $line;then
            continue
    else
            echo "Minion host:"$line
            ping -c 2 $line>/dev/null
            i=$(echo $?)
            #echo $i
            if [ $i -eq 0 ];then
                    echo "Push script file to $line"
                    ssh -n root@$line "mkdir $SCRIPT_DIR 2&1>/dev/null"
                    ssh -n root@$line "rm -rf $SCRIPT_DIR/$MINION_UPDATE_FILENAME"
                    scp $SCRIPT_DIR/$MINION_UPDATE_FILENAME root@$line:$SCRIPT_DIR
                    ssh -n root@$line "chmod +x $SCRIPT_DIR/*.sh"
                    ssh -n root@$line "$SCRIPT_DIR/$MINION_UPDATE_FILENAME"
            else
                    echo "Minion host does not find, Check file /script/minion_ip_list.txt"
            fi
    fi
    done < $MINION_LIST
    

    说明:
    $MINION_LIST是IP存放文件,每行一个
    这里通过test -z判断该行是否为空
    ping -c 2 $line>/dev/null给主机发送pin包并将输出内容丢到黑洞
    i=$(echo $?)根据ping -c输出判断主机是否存在,为0正常,否则表示不可达

    ssh -n root@$line "mkdir $SCRIPT_DIR 2&1>/dev/null"
    

    加-n参数具体作用见文章二

    十一、判断软件包是否安装脚本

    read -p "input your rpm_packet'name:" i
    #echo "\$i:" $i
    if [ ! $i  ];then
            echo "You need to input packetname like \"tree\""
    elif [ `rpm -qa |grep $i |wc -l` -ne 0 ];then
            echo "packet is installed:"
            echo "`rpm -qa |grep $i`"
    else
            yum install -y $i
    fi
    

    手动输入软件包名,rpm -qa判断是否已安装,根据if条件已安装的列出安装的软件包名,未安装的自动yum安装

    十二、添加crontab周期自动执行命令

    cat /var/spool/cron/root |grep mysql_auto_backup >>/dev/null
    k=$(echo "$?")
    if [[ $k -ne 0 ]];then
            echo " * 01 * * *  /script/mysql_auto_backup.sh" >> /var/spool/cron/root
            echo "create crontab..."
    else
            echo "crontab is already created"
    fi
    

    读取/var/spool/cron/root文件获得本机所有的定时计划任务
    利用grep及关键字查询是否有重复的计划任务
    然后利用echo命令将需要的任务添加到定时计划文件中

    十三、mysql数据库定是备份脚本

    #!/bin/bash
    HOSTIP=`ifconfig|grep inet|grep -v inet6|grep -v 127|sed 's/^[ \t]*//g'|cut -d ' ' -f2`
    /usr/mysql/bin/mysqldump  -uitXX -h$HOSTIP -pXXXX  itsm> /itsm_backup/itsm.$(date +%Y%m%d).bak.
    sql
    

    执行脚本可立刻将指定的数据可备份到指定目录下并在文件中加上当天日期方便管理
    配合crontab定时计划任务可以达到每天指定时间自动备份数据库的目的

    查看mysql数据库的用户语句

    mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
    

    十四、查看当前目录下所有文件大小

    [root@servicehot webapps]# du -sh *
    201M    web
    132M    web.tar.gz
    

    相关文章

      网友评论

          本文标题:三、日常运维脚本编写一些技巧

          本文链接:https://www.haomeiwen.com/subject/qxsibftx.html