Centos

為遠端備份腳本設置日誌記錄

  • December 22, 2012

所以我寫了一個簡短的腳本,我計劃每天通過一個 cron 作業執行它來打包我的站點文件並將它們發送到遠端位置。我還計劃合併數據庫轉儲,但我還沒有做到這一點。

然而,我今天的問題是,我不確定如何記錄每個命令的輸出,以了解該命令可能輸出的錯誤、警告或其他相關資訊。我還想安裝某種故障保險裝置,因此如果出現嚴重錯誤,腳本將停止執行並通過電子郵件或其他方式通知我。好的,電子郵件不是那麼重要,但會很好。

有人對此有任何想法嗎?這是我到目前為止所擁有的。

順便說一句,兩台伺服器都是執行標準 LAMP 的 CentOS 6.2。

#!/bin/sh

#################################
### Set Vars
#################################
THEDATE=`date +%m%d%y%H%M`

#################################
### Create Archives
#################################
tar -cf /root/backups/files/server_BAK_${THEDATE}.tar -C / var/www/vhosts
gzip /root/backups/files/server_BAK_${THEDATE}.tar

#################################
### Send Data to Remote Server
#################################
scp /root/backups/files/server_BAK_${THEDATE}.tar.gz user@host:/home/bak1/ftp/backups/

#################################
### Remove Data from this Server
#################################
rm -rf /root/backups/files/server_BAK_${THEDATE}.tar.gz

有點雜亂無章的答案,但請通讀一遍。

當出現任何類型的錯誤時,讓您的腳本停止執行:

set -e

這將確保如果您的任何命令失敗,腳本將在那裡失敗。其他好主意:

function error_handler() {
  # This will get run when an error is detected
}
trap error_handler ERR

這將在error_handler命令失敗時執行。您還可以讓EXIT處理程序在每次腳本退出時執行程式碼。

要將腳本的所有輸出擷取到文件中:

exec &> some_log_file

還能夠在日誌文件中查看腳本執行的命令(非常適合故障排除):

set -x

要使您的腳本拋出有關未定義變數的警告:

set -u

總結一下,開始你的腳本:

trap error_handler ERR
exec &> some_log_file
set -eux

如果您從 cron 執行腳本,如果您的腳本有任何輸出,它將向您發送一封電子郵件。要僅在出現問題時收到電子郵件,cat some_log_file請在錯誤處理程序中放入 a 並設置好。

更新:回答您的其他問題。

  • 為了防止錯誤破壞整個腳本,您可以在if語句中執行命令。像if ! <some command>; then <what do you do if it fails, or possibly nothing>; fi
  • 如果你有trap error_handler你還需要定義一個function error_handler.
  • 洗牌並不是一個壞主意,但是set -euset -eux
  • …如果您擔心安全性,則不應將 mysql 密碼放在命令行上(任何執行的人pgrep -lf mysql都會看到它)。請改用選項文件。然後您無需擔心日誌文件中的密碼。
option_file=`mktemp`
cat > $option_file <<EOF
[client]
password = $DB_PASSWD
user     = $DB_USER
EOF

然後mysqldump執行--default-extra-path=$option_file. $option_file當您不再需要它時,不要忘記刪除它。

  • 使用rsync而不是scp. 它對於複製相對較大的文件效果更好。

引用自:https://serverfault.com/questions/444654