実機にある6G程度のファイルを、バックアップサーバーにSCPで定期的に(cronで)コピーしようとしています。
cron を仕掛けてあるのはバックアップサーバー側です。
ターミナルから SCP を直接実行すると、特に問題なくファイルを転送してくれます。
しかし cron で同じ SCP コマンドを実行すると、6G のファイルのうち、2M 程度を
転送してプロセスが終了してしまいます。
ps コマンドで見ていても起動から10秒程度でプロセスが消えてしまい、
また、/var/log/cron にも何もエラーらしきログは出ていません。
(タイムスタンプを見る限り、書き込まれているのは /var/log/cron 以外にはなさそうです)
2M のファイルを vi で見ると、途中までは正しく転送されているようです。
バックアップ機のOSはCentOS 5 です。
これは何が原因なのでしょうか?
識者の方、教えて頂ければ幸いです。
interactの代わりに、expect eofで受けてあげれば良いと思います。
#!/bin/bash passwd="my-password" expect -c " set timeout 3600 spawn scp xxxx@example.com:/var/xxx/xxx.tgz /var/xxx/xxxx/ expect { \"Are you sure you want to continue connecting (yes/no)? \" { send \"yes\r\" expect \"password: \" { send \"$passwd\r\"; } } \"password: \" { send \"$passwd\r\"; } } expect { \"denied\" { exit 1 } eof { exit 0 } } "
interact コマンドがタイムアウトしていると思います。
set timeout 3600 で設定した値は interact コマンドには反映されませんので、
interact timeout 3600
と最後の行を書き換えると解決しないでしょうか?
あと、別解として interact コマンドを使わない方法もあるかと思います。
たとえば
scp -v ...
とすると、scpコマンドは詳細な情報を stderr へ出力するようになります。コピー終了時には "debug1: Exit status" というメッセージを stderr へ出力しますので、これを expect で拾うようにしても良いと思います。
ありがとうございます。
interact timeout 3600
を試してみたのですが、やはり転送結果は 2M でした。
cron で起動しているのに interact を使う必要がある事も何故かが分かっていないのですが、
このあたりは疑いの余地がありそうですね。。
ヒント程度の情報でも回答はどんどんして頂ければと思います。
ちなみに scp は expect コマンドより起動しています。
セキュリティ上好ましくないのは承知の上でやっています(まずは動作確認したかったので)
今のところの情報では疑うところの見当も付かんが、except を介することで余計にややこしくなってる気がする。
まずは正攻法でやってみることが先決。
/var/log/cron にも何もエラーらしきログは出ていません。
そこじゃねぇ。それは cron が何を起動したかしか書いてない。
実行中の出力自体はメールで送られてくるんだよ。
実行ユーザーか root のメールボックスを漁ってみる事。
interactの代わりに、expect eofで受けてあげれば良いと思います。
#!/bin/bash passwd="my-password" expect -c " set timeout 3600 spawn scp xxxx@example.com:/var/xxx/xxx.tgz /var/xxx/xxxx/ expect { \"Are you sure you want to continue connecting (yes/no)? \" { send \"yes\r\" expect \"password: \" { send \"$passwd\r\"; } } \"password: \" { send \"$passwd\r\"; } } expect { \"denied\" { exit 1 } eof { exit 0 } } "
ありがとうございます。す、すごいです。。
半ば諦めかけていました。。
eof を待つことで何故処理を継続してくれるのか、イマイチ理解できていませんが、
うまく処理ができました。
本当にありがとうございます。
何故これがうまくいったかに関しては、勉強しておきます。
ありがとうございます。す、すごいです。。
半ば諦めかけていました。。
eof を待つことで何故処理を継続してくれるのか、イマイチ理解できていませんが、
うまく処理ができました。
本当にありがとうございます。
何故これがうまくいったかに関しては、勉強しておきます。