rsync
ファイルをバックアップして同期するための次のスクリプトがあります。
このスクリプトをよりコンパクトで迅速に作成し、エラー処理機能を向上させるにはどうすればよいですか?
#!/bin/sh
errors=""
sudo rsync -avh --delete --no-o --no-g /home/xralf/audio /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in audio"
else
errors="${errors}error in audio\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/books /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in books"
else
errors="${errors}error in books\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/source_code /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in source_code"
else
errors="${errors}error in source_code\n"
fi
# more such directories with this code pattern
echo ${errors}
後でスクリプトが実行されるのを見ない計画だったので、結果を見てすべてがうまくいったと信じたかったのです。スクリプトを実行しましたが、最終的に私が持っている唯一の情報は、正確にerror in source_code
エラーが何であるか(どのファイルがエラーを引き起こしたか)はわかりませんでした。
答え1
あなたの優先順位ポケットそして早く(例:プロセス数を最小限に抑えますが、この場合はCPUやメモリではなくディスクIOに制限されます。)
#!/bin/bash
sudo rsync -a --delete --no-o --no-g \
/home/xralf/{audio,books,source_code} \
/media/extdevice/rsync_backups/ &&
echo "rsync completed successfully" 1>&2 || echo "rsync ended with errors" 1>&2
この-v
オプションを削除すると、出力のノイズが減り、明示的なエラー(存在する場合)に集中できます。1>&2
エラーメッセージが予想される場所に送信されるようにSTDOUTをSTDERRにリダイレクトします。無人で実行している場合は、次の選択肢が組み込みのものよりも優れている可能性がありますが、echo
追加のプロセスが必要です。
logger
サーバーを使用して集中処理にメッセージを送信できますsyslog
。正確な構文は、サーバーの構成によって異なります。タイミング情報を追加するために、スクリプトの最後の行は次の
date
ようになります。
date +"[%Y/%m/%d %H:%M:%S] rsync completed successfully" 1>&2 || \
date +"[%Y/%m/%d %H:%M:%S] rsync ended with errors" 1>&2
次のようなものを出力します。[2022/12/05 14:37:27] rsync completed successfully
答え2
強制されませんが、sh
より複雑なシェル(例:)を使用できる場合は、bash
次のことができます。
#!/bin/bash
dirs=( "audio" "books" "source_code" );
errors=()
for dir in "${dirs[@]}"; do
sudo rsync \
-avh --delete --no-o --no-g \
/home/xralf/"$dir" \
/media/extdevice/rsync_backups/ &&
echo "no errors in $dir" ||
errors+=("error in $dir\n")
done
printf '%s\n' "${errors[@]}"
stderrをキャプチャしたいかもしれませんが、これはスクリプトと同じことを行います。
答え3
このrsync
コマンドはパラメータを受け入れます--log-file=FILE
。バックアップが完了したら、エラーを確認できます。
--exclude-from=FILE
効率のためにも許容されます--include-from=FILE
。すべてのアイテムのリストを含むテキストファイルを作成できます。するそして欲しくないrsync
複数のコマンドではなく単一のコマンドを介してバックアップして呼び出したいです。
を参照してman rsync
ください。オンラインマニュアルページ。
答え4
というファイルを作成します。module.shそして、次のテキストを提供してください。
#!/usr/bin/env bash
# -A=Archive. Use recursion and preserve almost everything.
# -V=Verbose.
# -H=Preserve hard links.
# -Z=Compress.
# --Delete=
# If node in directory 'from' gets deleted,
# delete it in directory 'to'.
# --No-o=No Owner.
# --No-g=No Group.
# The --No's are partially undoing the Archive option.
sync_dir(){
local from="${1}";
local to="${2}";
rsync \
-avhz \
--delete \
--no-o \
--no-g \
"${from}/" \
"${to}" \
1>/dev/null \
;
# Store the sync success.
local sync_result="${?}";
# The project name is the last directory of the from string.
local project_name=$(grep -oE '[^/]*$' <<<"${from}");
local error="No error in: ${project_name}";
if [ "${sync_result}" -ne "0" ]; then
error="Error in: ${project_name}\n";
fi
printf "${error}\n";
};
その後、別のファイルを作成し、そこからモジュールをインポートします。
#!/usr/bin/env bash
. ./module.sh;
sync_dir '/home/xralf/audio' '/media/extdevice/rsync_backups/';
# More sync dirs here.
他のShebangに注意してください。これはPOSIXと互換性があります。
また、Rsyncに-zオプションを追加しました。途中でデータを圧縮します。