3

ubuntu ファイルシステムをバックアップしたいので、この小さなスクリプトを書きました。とても基本的なことですが、初めての試みなのでミスをするのが怖いです。また、結果が表示されるまでに数時間かかるため、経験豊富なプログラマーとして、何か間違ったことをしたかどうかを尋ねた方がよいと思います。

>の出力を記録するのか、それともmv結果を出力するのかに特に興味がありtarますか? tar コマンド内の変数も正しい方法ですか?

#!/bin/bash

mybackupname="backup-fullsys-$(date +%Y-%m-%d).tar.gz"

{ time tar -cfpzv $mybackupname --exclude=/$mybackupname --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev / && ls -gh $mybackupname && mv -v $mybackupname backups/filesystem/ ; } > backup-system.log

exit

これを実行する前に知っておくべきことはありますか?

4

2 に答える 2

6

Sandro さん、スクリプト内で間隔を空けて、個々のエラーを生成することを検討してください。物事を読みやすくします。

#!/bin/bash

mybackupname="backup-fullsys-$(date +%Y-%m-%d).tar.gz"

# Record start time by epoch second
start=$(date '+%s')

# List of excludes in a bash array, for easier reading.
excludes=(--exclude=/$mybackupname)
excludes+=(--exclude=/proc)
excludes+=(--exclude=/lost+found)
excludes+=(--exclude=/sys)
excludes+=(--exclude=/mnt)
excludes+=(--exclude=/media)
excludes+=(--exclude=/dev)

if ! tar -czf "$mybackupname" "${excludes[@]}" /; then
  status="tar failed"
elif ! mv "$mybackupname" backups/filesystem/ ; then
  status="mv failed"
else
  status="success: size=$(stat -c%s backups/filesystem/$mybackupname) duration=$((`date '+%s'` - $start))"
fi

# Log to system log; handle this using syslog(8).
logger -t backup "$status"

tarデバッグ情報 ( または の stderrなど)を保持したい場合はmv、tmpfile またはデバッグ ファイルへのリダイレクトで処理できます。ただし、コマンドが cron を介して実行され、出力がある場合、cron はそれを電子メールで送信する必要があります。サイレント cron ジョブは、成功した cron ジョブです。

一連ifの により、前のプログラムが成功している限り、各プログラムが実行されます。でコマンドをチェーンするようなもの&&ですが、失敗した場合に他のコードを実行できます。

のオプションの順序を変更したことに注意してください。tarその後-fに続くのは、保存先のファイルであるためです。また、このオプションは、tar からファイルを抽出-pする場合にのみ役立ちます。tarを作成 ( ) すると、許可は常に保存されます。-c

statこのコマンドの使用法は GNU/Linux では機能しますが、FreeBSD や Mac OSX などの他の unice では機能しないことに注意してください。BSD では、stat -f%z $mybackupname.

于 2012-07-13T11:20:34.433 に答える
3

あなたが持っているファイルリダイレクトは、の出力のみを記録しますmv

できるよ

{ tar ... && mv ... ; } > logfile 2>&1

両方の出力に加えて、発生する可能性のあるエラーをキャプチャします。

変数を展開するときは、常に変数を引用符で囲むことをお勧めします。

の必要はありませんexit

于 2012-07-13T09:43:39.293 に答える