在周一到周五做增量備份,在周六周日做完全備份
#!/bin/bash
定義變量
SRC=“/path/to/source” # 源目錄
BKUP=“/backup” # 備份主目錄
FUL=“KaTeX parse error: Expected 'EOF', got '#' at position 22: …ull" #? 完全備份目錄 INC="BKUP/inc” # 增量備份目錄
DATE=$(date +%Y%m%d%H%M%S) # 當前日期時間
創建備份目錄
mkdir -p $FUL
mkdir -p $INC
獲取當前日期
DOW=$(date +%u) # 1=Monday, 7=Sunday
獲取最近一次完全備份
LAST_FUL=$(ls -t $FUL | head -n 1)
完全備份
if [ $DOW -eq 6 ] || [ $DOW -eq 7 ]; then
cp -a $SRC $FUL/$DATE
else
# 增量備份
if [ -z “$LAST_FUL” ]; then
cp -a $SRC $FUL/$DATE
fi
fi
實現從代碼倉庫拉取最新代碼、構建、測試、部署到生產環境的自動化流程
#!/bin/bash
read -p "輸入git倉庫名" a
git_url=$a
read -p "輸入存放目錄" b
git_dir=$b
if [ ! -d “ g i t d i r " ] t h e n r e a d ? p " 是否創建目錄,輸入 y 或 n " c c a s e " {git_dir}" ] then read -p "是否創建目錄,輸入y或n" c case " gitd?ir"]thenread?p"是否創建目錄,輸入y或n"ccase"c” in
y)
mkdir g i t d i r ; ; n ) e x i t 1 ; ; ? ) e c h o " 請輸入選擇 " ; ; e s a c g i t c l o n e " {git_dir} ;; n) exit 1 ;; *) echo "請輸入選擇" ;; esac git clone " gitd?ir;;n)exit1;;?)echo"請輸入選擇";;esacgitclone"git_url" “$git_dir”
else
cd ${git_dir}
git pull origin master
fi
cd ${git_dir}
#要執行的代碼腳本寫這
檢測所有磁盤分區使用率和inode使用率并記錄到以當天日期為命名的日志文件里,當發現某個分區容量或者inode使用量大于85%
d_log=${d}.log
d_block=${d}block.log
for i in $(df -i | grep -v "IFree" | awk '{print $5}' | cut -d "%" -f 1)
dodf -i >> /tmp/$d_logif [ "$i" -ge 1 ]thenmail -s "title" root < /tmp/$d_logfi
done
for i in $(df -h | grep -v “Use” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}?' | cut -d "%" …d_block
if [ " i " ? g e 1 ] t h e n m a i l ? s " t i t l e " r o o t < / t m p / i" -ge 1 ] then mail -s "title" root < /tmp/ i"?ge1]thenmail?s"title"root</tmp/d_block
fi
done
一個巡檢腳本,用來檢測系統里面所有服務是否都正常運行假定,系統運行的服務有Nginx、MySQL、Redis、Tomcat要求腳本有內容輸出,可以明確告知服務是否正常運行。提示:1)如果服務進程存在并且端口監聽說明服務正常
#!/bin/bash#判斷ss和pgrep是否存在 check_tools () {
if ! which pgrep &>/dev/null
thenecho "沒有pgrep命令"exit 1
fiif ! which ss &>/dev/null
thenecho "沒有pgrep命令"exit 1
fi}#判斷進程是否存在可以用ps aux | grep 服務名
check_pid (){if pgrep "$1" &>/dev/nullthenreturn 0elsereturn 1fi
}#判斷端口是否存在
check_port (){
#統計端口的行數
port=$(ss -npl|grep ":$2"|wc -l)if [ "$port" -ne "0" ] &>/dev/nullthenreturn 0elsereturn 1fi}
#判斷端口和經常是否同時存在來判斷服務是否正常
check_srv (){
if check_pid "$1" && check_port "$2"
thenecho "$1正常"
elseecho "$1不正常"fi
}check_tools
#輸入相應服務和端口
check_srv ssh 22
一個監控腳本,監控某站點訪問是否正常
#!/bin/bash#檢查本機有沒有curl命令
if ! which curl &>/dev/null
thenecho "沒有安裝curl"yum -y install curlif [ "$?" -ne "0" ]thenecho "沒有curl"exitfi
fi
#獲取狀態碼
code=$(curl 3 -I $1 2>/dev/null | grep "HTTP" | awk '{print $2}')
#判斷狀態碼是否正確
if echo $code | egrep -q "^2[0-9][0-9]|^3[0-9][0-9]"
thenecho "$1訪問正常"
elseecho "$1訪問不正常"
fi
寫一個檢測腳本,用來檢測本機所有磁盤分區讀寫是否都正常。提示: 可以遍歷所有掛載點,然后新建一個測試文件,然后再刪除測試文件,如果可以正常新建和刪除,那說明該分區沒問題
#!/bin/bashfor mount_p in $(df -h | grep -v Size | grep -v tmpfs | awk '{print $NF}')
dotouch $mount_p/dir && rm -rf $mount_p/dirif [ "$?" -eq "0" ]thenecho "讀寫沒問題"elseecho "讀寫有問題"fi
done
自動部署更新服務腳本(流程是:停止并刪除舊容器,刪除舊鏡像,拉取新鏡像,運行新容器)
#!/bin/bash# 接收腳本參數
# $1: Harbor倉庫地址,例如192.168.1.100:5000
harbor_url=$1
# $2: Harbor中的項目名稱,例如devops-project
harbor_project_name=$2
# $3: 項目/應用名稱,例如user-service
project_name=$3
# $4: 鏡像標簽版本,例如v1.2.0
tag=$4
# $5: 容器端口映射,例如8080:8080(主機端口:容器端口)
port=$5# 組合完整的鏡像地址,例如:192.168.1.100:5000/devops-project/user-service:v1.2.0
imageName=$harbor_url/$harbor_project_name/$project_name:$tag# 查找正在運行的容器(按項目名稱過濾)
containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
# 如果找到已有容器
if [ "$containerId" != "" ] ; then# 停止運行中的容器(優雅關閉,等待10秒)docker stop $containerId# 強制刪除已停止的容器docker rm $containerIdecho "Delete Container Success"
fi# 查找本地鏡像(按項目名稱過濾)
imageId=`docker images | grep ${project_name} | awk '{print $3}'`
# 如果找到本地鏡像
if [ "$imageId" != "" ] ; then# 強制刪除鏡像(多個標簽時也能刪除)docker rmi -f $imageIdecho "Delete Image Success"
fi# 登錄Harbor私有倉庫(硬編碼憑證存在安全風險,建議使用安全憑據管理)
docker login -u DevOps -p P@ssw0rd $harbor_url# 從Harbor拉取最新鏡像
docker pull $imageName# 啟動新容器(后臺運行)
# -d: 后臺模式
# -p: 端口映射(將主機的$port前半部分映射到容器的$port后半部分)
# --name: 指定容器名稱
docker run -d -p $port --name $project_name $imageName# 輸出部署結果
echo "Start Container Success"
echo "Container Name: $project_name"
echo "Access Port: $port"