web-dev-qa-db-ja.com

rsyncはcrontabに入れるまでは正常に機能します(更新:「date」はcrontabでは機能しません)

この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'(バッククォートで囲まれている)が問題の原因です。コマンドからそれを削除すると、問題なく動作します...包括的なバックアップログがあることは私にとって重要ですが、それでもこれに対する解決策を見つけたいと思います。私はそれをハッキングし続けますが、誰かが知っているなら、私のゲストになってください。

3

更新で述べたように、問題は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で直接問題ないと思います。

1

rsyncコマンドを.sh(シェル)スクリプトに入れて、crontabで起動します

  • このサンプルのようなシェルスクリプトについて検索する

    test.sh

#!/ bin/sh

echo $2 echo $1
  • スクリプトでこの構文を使用して、バックアップファイルに名前を付けます

now = $(date + "%m_%d_%Y")

.. &> /var/log/backup/{$now}_hourlybackup.log
0
khaled_webdev

チェックされた回答にコメントするだけでしたが、新しく、まだコメントできません。

この問題が発生した理由を説明したいと思います。 %は、改行と、最初の行の後のテキストが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番目の `を見つけることができません。重要なのは、本当に改行が必要でない限り、すべての%文字をエスケープする必要があることを理解することです。

0
D French

ほとんどの場合、rsyncへのフルパスを入力しなかったためです。

/usr/bin/rsync -av ...

また、小さなシェルスクリプトを作成してそのコマンドをそこに配置し、cronからその単一のスクリプトを実行することもできます。

0
bakytn

パスの問題である可能性がありますが、ルートのパスに/usr/binが含まれている必要があるため、発生する可能性は低くなります。

ただし、crontabコマンドはおそらく Bashでは実行されませんがDashで実行されます です。 &>構造は、「バシズム」[ 1 ] [ 2 ]です。

交換

command >& file

command > file 2>&1

ダッシュで意図したとおりに機能させるため。

0