ラズパイのカメラ画像データ(定期撮影)を、自動でサーバーと同期させたくてrsyncです。
ちょっとはまって一応解決できたので共有します。
一応=後述の通り、あまりスマートな解決策ではない気もします。
このスクリプトを実行するとあっさり動きます、ちょっと感動します、イケないことをしている感もあります。
#!/bin/sh
expect -c "
spawn rsync -arv 同期元ディレクトリ 同期先ユーザー名@同期先ホスト:同期先ディレクトリ
expect \"Password:\"
send \"同期先ユーザーのパスワード\n\"
interact
"
しかし、Cronから実行すると沈黙します。
ええぇぇ…そんなことあるのかしら。
interact命令は、「制御をユーザに返す」ことを指示します。
そのため、cron の場合、制御を返されても引き継ぐユーザーがおらず、正常に動作していなかったようです。
なるほど。
#!/bin/sh
expect -c "
spawn rsync -arv 同期元ディレクトリ 同期先ユーザー名@同期先ホスト:同期先ディレクトリ
expect \"Password:\"
send \"同期先ユーザーのパスワード\n\"
expect eof
exit
"
Cronから実行すると、同期先ディレクトリにテンポラリファイルが一瞬出来て、動いた気がしました。
ターミナルで実行すると、同期対象のリストまでは表示されますが、そのまま終了してしまいます。
https://stackoverflow.com/questions/18502236/rsync-giving-error-when-executing-witin-expect-script-using-cron
の通りにしたら機能しました。
#!/bin/sh
expect -c "
spawn rsync -arv 同期元ディレクトリ 同期先ユーザー名@同期先ホスト:同期先ディレクトリ
expect \"Password:\"
send \"同期先ユーザーのパスワード\n\"
expect eof
sleep 90
exit
"
exitをsleepさせるって…荒業ですが、まあいいか。
同期が完了しない場合は、次回の同期に先送りされるのが、ちょっと嫌な感じです。