三、日常運維指令碼編寫一些技巧

weixin_34054866發表於2018-08-15

一、查詢服務埠號
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

相關文章