このrsync
コマンドは、コマンドライン(Ubuntu Server 12.04.1 LTS)から実行すると問題なく機能します。毎時、正時に実行し、結果を(エラーとともに)ログファイルに出力したいと思います。これが私がcrontabに入れたコマンドです:
0 * * * * root rsync -av --delete -e "ssh -i /root/.ssh/id_rsa"
user@Host:/path/to/dir/ user@Host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' &> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log
Bashから期待したとおりに機能しているにもかかわらず、crontabでは何も起こりません。ファイルにエラーを書き込むことすらありません。ランニング ps aux | grep rsync
何も興味を示さない。問題が見つからないようです。何か案は?
PDATE:受け取った回答のおかげで、コマンドを微調整して正しく機能するようにすることができましたが、いずれも独自に問題を解決することはできませんでした。今朝私が見つけた作品は次のとおりです。
0 * * * * /usr/bin/rsync -av --delete -e "ssh -i /root/.ssh/id_rsa"
user@Host:/path/to/dir/ user@Host:/path/to/another/dir/ /destination/dir
--exclude='.DS_Store' > /var/log/backup/_hourlybackup.log 2>&1
何らかの理由でdate '+%Y_%m_%d_%H:%M'
(バッククォートで囲まれている)が問題の原因です。コマンドからそれを削除すると、問題なく動作します...包括的なバックアップログがあることは私にとって重要ですが、それでもこれに対する解決策を見つけたいと思います。私はそれをハッキングし続けますが、誰かが知っているなら、私のゲストになってください。
更新で述べたように、問題はdate
コマンドにあります。コマンドをシェルスクリプトではなくcrontab
に直接書き込んでいる場合は、date
オプション文字列の%
をエスケープする必要があります。最終的に機能したものは次のとおりです。
0 * * * * rsync -av --delete user@Host:/path/to/dir
user@Host:/path/to/another/dir /path/to/destination
--exclude='.DS_Store' >
/var/log/backup/`date '+\%Y_\%m_\%d_\%H'`h_hourlybackup.log 2>&1
私がこれを理解するのを手伝ってくれたすべての人に感謝します。このコマンドは、将来、より長く複雑になる可能性があるため、独自のシェルスクリプトに適していますが、今のところ、crontab
で直接問題ないと思います。
rsyncコマンドを.sh(シェル)スクリプトに入れて、crontabで起動します
このサンプルのようなシェルスクリプトについて検索する
test.sh
#!/ bin/sh
echo $2 echo $1
now = $(date + "%m_%d_%Y")
.. &> /var/log/backup/{$now}_hourlybackup.log
チェックされた回答にコメントするだけでしたが、新しく、まだコメントできません。
この問題が発生した理由を説明したいと思います。 %は、改行と、最初の行の後のテキストがstdinとしてコマンドに指定されたことを示します。
だからあなたのcronコマンド:
rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@Host:/path/to/dir/ \
user@Host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
&> /var/log/backup/`date '+%Y_%m_%d_%H:%M'`_hourlybackup.log
次のように解釈されます:
rsync -av --delete -e "ssh -i /root/.ssh/id_rsa" user@Host:/path/to/dir/ \
user@Host:/path/to/another/dir/ /destination/dir --exclude='.DS_Store' \
&> /var/log/backup/`date '+<<EOI
Y_
m_
d_
H:
M'`_hourlybackup.log
EOI
シェルがそれを実行しようとすると、コマンドのstdinの一部として存在するため、2番目の `を見つけることができません。重要なのは、本当に改行が必要でない限り、すべての%文字をエスケープする必要があることを理解することです。
ほとんどの場合、rsync
へのフルパスを入力しなかったためです。
/usr/bin/rsync -av ...
また、小さなシェルスクリプトを作成してそのコマンドをそこに配置し、cronからその単一のスクリプトを実行することもできます。
パスの問題である可能性がありますが、ルートのパスに/usr/bin
が含まれている必要があるため、発生する可能性は低くなります。
ただし、crontabコマンドはおそらく Bashでは実行されませんがDashで実行されます です。 &>
構造は、「バシズム」[ 1 ] [ 2 ]です。
交換
command >& file
と
command > file 2>&1
ダッシュで意図したとおりに機能させるため。