bash:不要なソフトウェアを使用しないバックアップ

重要な情報をバックアップする-すべてのシステム管理者がこのようなタスクに直面しています。 タスクは些細なことのように思われ、多くの読者の関心を引くことはありません。 しかし、例えば、そのような記事はある時点で私を大いに助けてくれるので、この記事はそうあるべきだと思います。



タスク:最小限のサードパーティソフトウェアを使用して、ローカルディレクトリと別のサーバーにデータをバックアップし、障害が発生した場合に管理者にログを記録して通知します。 自動バックアップ用のほとんどのソフトウェアの主な機能はすべてインストールされていますが、インストールせず、したがってバグもありません(実際、同様の考えに至りました)。



ここまでがポイントです。



まず、スクリプトを作成して開きます

nano backup-script
      
      





スクリプトで次の行を追加します

 #!/bin/bash
      
      





いくつかの変数を宣言します。

TN-TASKNAME-ジョブ名:ファイル名の記録と決定に使用されます。

いくつかのタスク(月次、週次、日次)があり、各ケースのスクリプトを書くのが面倒なので、必要な行のコメントを外すだけの普遍的なタスクを作成しました。 エンコーディングや不正なコマンドパラメータの問題が発生しないようにするには、タスク名をスペースなしで(できればラテン語で)記述する必要があります。

 TN=docs-monthly<br /> #TN=docs-weekly<br /> #TN=docs-daily
      
      





OF-出力ファイル-出力ファイルの名前。 TN変数、つまりジョブの名前から派生。

 OF=$TN.tar.gz
      
      





ログファイルへのパスを持つ変数を宣言し、すべてのエラーメッセージと残りをログに出力します。

 LOGFILE=/var/log/backup.log
      
      





バックアップの開始に関するログに記録しましょう(日付、時刻、タスク名)

 echo >>$LOGFILE echo "=====================================================" >>$LOGFILE echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE echo " \"$TN\" ..." >>$LOGFILE
      
      





コマンドパラメータにスペースを含むディレクトリ名(例:tar)を指定すると、スクリプトが失敗するという事実に問題があります。 この解決策はインターネット上で発見されました-Linuxオペレーティングシステムは、コマンドパラメーターの標準区切り文字としてスペースを使用します。 標準の区切り文字($ IFS変数に格納されている)をスペースとは異なるように再定義します(例:\ n-改行文字)。

標準セパレータの古い値を覚えておいてください

 OLD_IFS=$IFS
      
      





標準の区切り文字を独自のものに置き換えます

 IFS=$'\n'
      
      





SRCD-SouRCeディレクトリ-バックアップ用のデータディレクトリ

これで、いくつかのディレクトリ、改行をリストできます。

 SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N"
      
      





TGTD-TarGeTディレクトリ-バックアップが追加されるディレクトリ

 TGTD="/var/backups/"
      
      





当然、重要なバックアップをソースでのみ保持することは少なくとも軽薄であることを理解しています。 したがって、リモートリソースにコピーを残し、mountとfstabを使用して個別にマウントします。 1つのマウントではなく、mountとfstabを使用した理由をすぐに説明します。このディレクトリを他のスクリプトにマウントしますが、使い慣れたプログラマーの1人が言ったように、優れたプログラマーは同じコードを2回(文字通り、覚えていませんが、その意味が伝わることを願っています)。

 TGTD2="/mnt/archive/"
      
      





「新しいアーカイブを作成する」オプションのアーカイブプロセス自体

 tar -czf $TGTD$OF $SRCD &>>$LOGFILE
      
      





およびオプション「古いアーカイブのファイルを更新する」

 tar -u -f $TGTD$OF $SRCD &>>$LOGFILE
      
      





2番目のケースでは、たとえば、毎日更新される毎週のアーカイブがあり、それらの$ TN(ジョブ名)がそれぞれ一致しないため、$ OFではなく、$ OFの代わりに特定のファイル名を使用することをお勧めします。



変数「?」 最後のコマンドの実行ステータスが取得されます。 後で使用するために保存します。

 STATUS=$?
      
      





標準セパレーターを元の値に戻します。

 IFS=$OLD_IFS
      
      





ここで条件を追加しましょう-tarアーカイブへのパッキングのプロセスがエラーで終了した場合、管理者にメッセージを送信し、失敗したバックアップファイルを削除します。 それ以外の場合は、さらに続行します。ネットワークボールをマウントし、アーカイブのコピーをそこにスローします。 各操作の後、実行結果を確認し、ログを書き込み、続行するか、管理者に通知して手順を中断します。

 if [[ $STATUS != 0 ]]; then rm $TGTD$OF &>>$LOGFILE echo "###########################################" >>$LOGFILE echo "###  !   . ###" >>$LOGFILE echo "###########################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF  " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE else echo "    \"$TGTD$OF\"" >>$LOGFILE echo "    $(date +'%R %d-%b-%Y')!" >>$LOGFILE echo "      $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE if [[ $? != 0 ]]; then echo "#############################################################" >>$LOGFILE echo "###       ###" >>$LOGFILE echo "#############################################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF     " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE exit fi echo "     " >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>>$LOGFILE if [[ $? != 0 ]]; then echo "#############################################################" >>$LOGFILE echo "###        ###" >>$LOGFILE echo "#############################################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF     " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE else echo "     $(date +'%R %d-%b-%Y')!" >>$LOGFILE echo "   \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "      $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo "   !" >>$LOGFILE fi exit
      
      







このプロセスでは、アーカイブをローカルの格納域からリモートの格納域にコピーします。 当然、各操作が正常に完了したことを確認し、すべてをログに書き込みます。

組織にはJabberサーバーがあるため、管理者にメッセージを送信するにはXMPPメッセージを使用します。メールにアクセスし、パスワードを入力し、リンクを突いて、ブラウザーがすべてを表示するのを待つよりも、障害に関するクイックメッセージを受信するのが好きです。 いずれにせよ、sendxmppの代わりにsendmailを使用するユーザーはいません。

ファイル/ usr / local / etc / XMPP_settingsは次のとおりです。



 #_@;IP_jabber_:_jabber_ _ login@domen;127.0.0.1:5222 password
      
      





fstabファイルで、Windowsボールの接続を説明する行

 //192.168.0.250/arhiv /mnt/archive cifs noauto,rw,iocharset=utf8,cp866,file_mod=0666,dir_mod=0777,noexec,_netdev,credentials=/root/.passwd_to_archive_directory 0 0
      
      





あとは、タスクをcronに追加するだけです。 これは/ etc / crontabファイルを使用して行うことができますが、Windowsから残されたGUIの習慣のため、このような場合にはWebインターフェイスを使用します。 コマンドは、root権限、つまり、sudo bash backup_scriptで実行する必要があります。 コマンドをcronに追加すると、すぐにrootとして実行されることを決定できます



議論の中で、ログスプロールの問題が提起されました。 私の考えでは最も単純な方法でした。ログの最後のN行(たとえば300)だけを保存します。ログに最後の300行を一時ファイルに保存する2行をスクリプトに追加し、それを使用してログを消去します

 tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE
      
      





スクリプトの全文を提供します。

 #!/bin/bash TN=docs-monthly #TN=docs-weekly #TN=docs-daily OF=$TN.tar.gz LOGFILE=/var/log/backup.log echo >>$LOGFILE echo "=====================================================" >>$LOGFILE echo "$(date +'%d-%b-%Y %R')" >>$LOGFILE echo " \"$TN\" ..." >>$LOGFILE OLD_IFS=$IFS IFS=$'\n' SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N" TGTD="/var/backups/" TGTD2="/mnt/archive/" tar -czf $TGTD$OF $SRCD &>>$LOGFILE #tar -u -f $TGTD$OF $SRCD &>>$LOGFILE STATUS=$? IFS=$OLD_IFS if [[ $STATUS != 0 ]]; then rm $TGTD$OF &>>$LOGFILE echo "###########################################" >>$LOGFILE echo "###  !   . ###" >>$LOGFILE echo "###########################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF  " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE else echo "    \"$TGTD$OF\"" >>$LOGFILE echo "    $(date +'%R %d-%b-%Y')!" >>$LOGFILE echo "      $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE if [[ $? != 0 ]]; then echo "#############################################################" >>$LOGFILE echo "###       ###" >>$LOGFILE echo "#############################################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF     " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE exit fi echo "     " >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>>$LOGFILE if [[ $? != 0 ]]; then echo "#############################################################" >>$LOGFILE echo "###        ###" >>$LOGFILE echo "#############################################################" >>$LOGFILE echo "$(date +'%d-%b-%Y %R%n')  $OF     " | sendxmpp -t -f /usr/local/etc/XMPP_settings _@ &>>$LOGFILE else echo "     $(date +'%R %d-%b-%Y')!" >>$LOGFILE echo "   \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "      $TGTD_archive" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo "   !" >>$LOGFILE fi tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE exit
      
      







ご清聴ありがとうございました!



All Articles