rsync 傳輸大量檔案時若中斷無人值守,需自動化監控腳本定期檢查目標目錄大小與 rsync 進程狀態,若發現進程消失且檔案未傳完則自動重啟傳輸。本文提供一個簡易監控腳本邏輯並分析其侷限性。

monitor_rsync.sh#!/bin/bash
# 目標目錄預期大小 (MB) - 需依實際來源調整
EXPECTED_SIZE=11517
TARGET_DIR="/var/www/vhosts/"
RSYNC_SCRIPT="/root/rsync.sh"
# 取得目前目錄大小 (MB)
current_size=$(du -sm "${TARGET_DIR}" | awk '{print $1}')
# 檢查 rsync 進程數
rsync_count=$(ps -C rsync --no-header | wc -l)
if [ "${current_size}" -eq "${EXPECTED_SIZE}" ]; then
echo "Files downloaded completely!"
exit 0
fi
if [ "${rsync_count}" -eq 1 ]; then
echo "rsync is running..."
else
echo "rsync stopped, restarting..."
# 強制殺掉可能殘留的進程
pkill -9 rsync
sleep 1
# 背景重啟傳輸腳本
nohup sh "${RSYNC_SCRIPT}" &
fi
#!/bin/bash
rsync -avz --progress --partial \
user@source-server:/var/www/vhosts/ \
/var/www/vhosts/
chmod +x monitor_rsync.sh rsync.sh
# 加入 crontab 每 5 分鐘檢查一次
*/5 * * * * /root/monitor_rsync.sh >> /var/log/rsync_monitor.log 2>&1
ps -C rsync 仍會計入僵屍進程,建議改用 pgrep -x rsync 搭配 ps -o stat= -p PID 過濾 Z 狀態ssh source "du -sm /path")rsync -avz --checksum --dry-run 驗證systemd 服務單元管理 rsync、或採用 lsyncd (即時同步守護程式)