SUSE Linux Shell 腳本與自動化指南
在 SUSE Linux 系統管理中,Shell 腳本(Shell Script)是提高效率、自動化操作與批次處理的重要工具。本指南介紹在 SUSE 上撰寫 Shell 腳本的基礎概念、進階技巧,並提供多個自動化案例與排程方法。
目錄
Shell 腳本基礎
建立與執行
# 建立腳本檔案
nano myscript.sh
# shebang
#!/usr/bin/env bash
echo "Hello, openSUSE!"
# 設定執行權限
chmod +x myscript.sh
# 執行
./myscript.sh
變數與運算
# 變數定義
NAME="SUSE Admin"
echo "Welcome, $NAME"
# 使用者輸入
read -p "Enter your name: " USER
echo "Hello, $USER"
# 數值運算
A=10
B=3
SUM=$((A + B))
echo "Sum = $SUM"
條件判斷與迴圈
if / else
read -p "Enter a number: " NUM
if (( NUM > 0 )); then
echo "Positive"
else
echo "Zero or Negative"
fi
case
read -p "Choice (start|stop|status): " CMD
case $CMD in
start) echo "Starting service";;
stop) echo "Stopping service";;
status) echo "Checking status";;
*) echo "Invalid choice";;
esac
for / while
for i in {1..5}; do
echo "Loop $i"
done
CNT=1
while (( CNT <= 5 )); do
echo "Count $CNT"
CNT=$((CNT+1))
done
函數與模組化
# 定義函數
log_info() {
echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') $*"
}
# 調用
log_info "Starting backup..."
模組化腳本:
# utils.sh
#!/usr/bin/env bash
log_info() { echo "[INFO] $(date ...) $*"; }
# main.sh
#!/usr/bin/env bash
source ./utils.sh
log_info "Main script executing"
自動化案例
系統更新與清理
#!/usr/bin/env bash
log_info "Updating system..."
sudo zypper refresh
sudo zypper update -y
log_info "Auto-clean orphan packages..."
sudo zypper packages --unneeded | awk '/i/ {print $5}' | xargs sudo zypper remove -y
備份與歸檔
#!/usr/bin/env bash
DEST="/backup/$(date +%F)"
mkdir -p "$DEST"
log_info "Backing up /etc to $DEST"
tar czf "$DEST/etc-backup.tar.gz" /etc
監控並告警
#!/usr/bin/env bash
THRESHOLD=80
USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if (( USAGE > THRESHOLD )); then
echo "Disk usage $USAGE% exceeds $THRESHOLD%" | mail -s "Disk Alert" admin@example.com
fi
排程與自動執行
cron 與 cronie
安裝與啟動:
sudo zypper install cronie -y
sudo systemctl enable --now cron
編輯排程:
crontab -e
# 每日凌晨 2 點執行更新
0 2 * * * /path/to/update_script.sh
systemd 定時服務
建立 /etc/systemd/system/myscript.timer
:
[Unit]
Description=Run myscript daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
建立對應 .service
:
[Unit]
Description=My Script Service
[Service]
ExecStart=/usr/local/bin/myscript.sh
啟用:
sudo systemctl enable --now myscript.timer
日誌與報表
- 建議將腳本輸出導入日誌:
/path/to/script.sh >> /var/log/myscript.log 2>&1
- 使用
logrotate
管理自動生成的日誌: 在/etc/logrotate.d/myscript
:/var/log/myscript.log { weekly rotate 4 compress missingok notifempty copytruncate }
- 每日或每週可用
logwatch
產生日誌摘要報表。
安全性與最佳實踐
- 避免在腳本中硬編碼密碼;使用憑證管理或
sudoers
免密執行。 - 加入錯誤檢查:
set -euo pipefail
- 使用絕對路徑以避免環境差異。
- 註解與日誌清晰有助於維護。
結語
通過本指南的內容,您可在 SUSE Linux 上撰寫靈活且健壯的 Shell 腳本,並透過 cron 或 systemd 定時排程自動化各種系統管理任務,從而大幅提升運維效率與系統穩定度。