三、日常運維指令碼編寫一些技巧
一、查詢服務埠號
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
相關文章
- DBA日常維護SQL指令碼_自己編寫的SQL指令碼
- 你必須知道的python運維常用指令碼!(日常更新)Python運維指令碼
- Linux編寫Bash指令碼的10個技巧Linux指令碼
- Python技法:實用運維指令碼編寫(程式/檔案/目錄操作)Python運維指令碼
- RAC日常運維運維
- 油猴指令碼編寫指令碼
- 編寫git指令碼.shGit指令碼
- Linux 系統日常運維 9 大技能,搞定 90% 日常運維Linux運維
- 史上最全近百條Oracle DBA日常維護SQL指令碼指令OracleSQL指令碼
- 運維指令碼備忘錄運維指令碼
- 運維日常工作運維
- 在Linux中,如何編寫一個指令碼來自動執行日常任務?Linux指令碼
- EA指令碼編寫要點指令碼
- 運維之shell指令碼初識運維指令碼
- Hbuilder快速程式碼編寫技巧UI
- SQL SERVER日常運維(一)SQLServer運維
- 編寫shell指令碼的規範指令碼
- systemd 編寫服務管理指令碼指令碼
- 如何編寫高效的 Shell 指令碼指令碼
- 如何使用zx編寫shell指令碼指令碼
- Oracle運維指令碼-巡檢(RAC版)Oracle運維指令碼
- MongoDB日常運維-02安裝MongoDB運維
- 編寫可維護的程式碼是一種溝通技巧 - Max Chernyak
- [轉]寫好shell指令碼的13個技巧指令碼
- nGrinder中快速編寫groovy指令碼01-指令碼結構指令碼
- 日常積累——彙編檔案編寫
- scala入門之編寫scala指令碼指令碼
- 編寫自己的Acunetix WVS漏洞指令碼指令碼
- 技能篇:shell教程及指令碼編寫指令碼
- 從零開始編寫指令碼引擎指令碼
- 專案啟動指令碼的編寫指令碼
- Oracle運維指令碼-巡檢(單機版)Oracle運維指令碼
- Oracle運維指令碼-收集統計資訊Oracle運維指令碼
- 運維指令碼:網路連通性測試運維指令碼
- 運維指令碼: 實時監測登入運維指令碼
- 一些驚豔到我的運維實施技巧和思路運維
- Docker Swarm 日常運維命令筆記DockerSwarm運維筆記
- Lync日常運維常用命令運維