Shammer's Philosophy

My private adversaria

cronでrsyncが動作しない

Debian 環境で定期バックアップのために rsync を cron で動かすようにしたのだがうまくいかない。実施コマンドは以下の通り。

rsync -ave ssh $BACKUP_TARGET $REMOTE_USER@$REMOTE_HOST:$BACKUP_DIRECTORY

$ の情報は実際の環境依存値が入る。そして、cron でなければ問題なく動作する。

うまくいかない理由を確認するために tail -f /var/log/syslog を見ると、定期的に実行されては以下のようなエラーとなっていた。

grandchild #8588 failed with exit status 255

status のところはタイミングによっては 12 だったり 14 だったりしたが、要は動いていないということだ。そして、いろいろ調べて下記のサイトを見つけた。

 [ubuntu] Can't run rsync bash script with cron [Archive] - Ubuntu Forums

Ubuntu のフォーラムのようだが、ここの解決策が役にたった。cron の場合、環境変数情報がうまく共有されず、SSH_AUTH_SOCK が利かないようだ。なので、これを cron で実行される際に同時に指定してやる必要があるらしい。実行されるスクリプトは以下になった。

#!/bin/sh

# Debian Squeeze
# export SSH_AUTH_SOCK=$(find /tmp/keyring*/ -perm 0755 -type s -user $USER -group $GROUP -name 'socket.ssh' | head -n 1)

# Debian Wheezy
export SSH_AUTH_SOCK=$(find ~/.cache/keyring*/ -perm 0755 -type s -user $USER -group $GROUP -name '*ssh' | head -n 1)

rsync -ave ssh --log-file=$RSYNC_LOG_FILE_NAME $BACKUP_TARGET $REMOTE_USER@$REMOTE_HOST:$BACKUP_DIRECTORY

Squeeze と Wheezy では SSH_AUTH_SOCK の場所や名前が違うようだ。このスクリプトは Wheezy 環境のもの。Squeeze 環境の場合は SSH_AUTH_SOCK のコメント行を変える。あと、事前に SSH の鍵を REMOTE_HOST へ格納しておく必要もある。