SCP に関する?質問です。

実機にある6G程度のファイルを、バックアップサーバーにSCPで定期的に(cronで)コピーしようとしています。
cron を仕掛けてあるのはバックアップサーバー側です。

ターミナルから SCP を直接実行すると、特に問題なくファイルを転送してくれます。
しかし cron で同じ SCP コマンドを実行すると、6G のファイルのうち、2M 程度を
転送してプロセスが終了してしまいます。
ps コマンドで見ていても起動から10秒程度でプロセスが消えてしまい、
また、/var/log/cron にも何もエラーらしきログは出ていません。
(タイムスタンプを見る限り、書き込まれているのは /var/log/cron 以外にはなさそうです)

2M のファイルを vi で見ると、途中までは正しく転送されているようです。
バックアップ機のOSはCentOS 5 です。

これは何が原因なのでしょうか?
識者の方、教えて頂ければ幸いです。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/10/25 16:52:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:makeworld No.3

回答回数75ベストアンサー獲得回数23

ポイント250pt

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 }
  }
"
id:snaa1d_1

ありがとうございます。す、すごいです。。

半ば諦めかけていました。。

eof を待つことで何故処理を継続してくれるのか、イマイチ理解できていませんが、

うまく処理ができました。

本当にありがとうございます。

何故これがうまくいったかに関しては、勉強しておきます。

2009/10/25 16:51:42

その他の回答2件)

id:pyopyopyo No.1

回答回数377ベストアンサー獲得回数98

ポイント90pt

interact コマンドがタイムアウトしていると思います。

set timeout 3600 で設定した値は interact コマンドには反映されませんので、

interact timeout 3600 

と最後の行を書き換えると解決しないでしょうか?

あと、別解として interact コマンドを使わない方法もあるかと思います。

たとえば

scp -v ...

とすると、scpコマンドは詳細な情報を stderr へ出力するようになります。コピー終了時には "debug1: Exit status" というメッセージを stderr へ出力しますので、これを expect で拾うようにしても良いと思います。

id:snaa1d_1

ありがとうございます。

interact timeout 3600

を試してみたのですが、やはり転送結果は 2M でした。

cron で起動しているのに interact を使う必要がある事も何故かが分かっていないのですが、

このあたりは疑いの余地がありそうですね。。

ヒント程度の情報でも回答はどんどんして頂ければと思います。

2009/10/24 12:44:25
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント45pt

ちなみに scp は expect コマンドより起動しています。

セキュリティ上好ましくないのは承知の上でやっています(まずは動作確認したかったので)

今のところの情報では疑うところの見当も付かんが、except を介することで余計にややこしくなってる気がする。

ssh scp sftp の正しい自動実行方法

まずは正攻法でやってみることが先決。


/var/log/cron にも何もエラーらしきログは出ていません。

そこじゃねぇ。それは cron が何を起動したかしか書いてない。

実行中の出力自体はメールで送られてくるんだよ。

実行ユーザーか root のメールボックスを漁ってみる事。

id:makeworld No.3

回答回数75ベストアンサー獲得回数23ここでベストアンサー

ポイント250pt

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 }
  }
"
id:snaa1d_1

ありがとうございます。す、すごいです。。

半ば諦めかけていました。。

eof を待つことで何故処理を継続してくれるのか、イマイチ理解できていませんが、

うまく処理ができました。

本当にありがとうございます。

何故これがうまくいったかに関しては、勉強しておきます。

2009/10/25 16:51:42
  • id:snaa1d_1
    ちなみに scp は expect コマンドより起動しています。
    セキュリティ上好ましくないのは承知の上でやっています(まずは動作確認したかったので)
  • id:snaa1d_1
    ちなみに以下のような内容です。
    cron で起動したときのみ、2Mで中断されます。。

    expect -c "
    set timeout 3600
    spawn scp xxxx@example.com:/var/xxx/xxx.tgz /var/xxx/xxxx/
    expect {
    \"xxxx@example.com's password: \" {
    send \"my-password\r\"
    }
    }
    interact
    "
  • id:snaa1d_1
    ちなみに・・
    上記コマンドで interact 命令を削ると、cron から起動してもファイルは全く転送されず、
    interact 命令をつけると 2M までは転送されます。
    http://slashdot.jp/~nova/journal/470783
    を参考にしたのですが、私は interact 無しではうまくいきませんでした。
  • id:TRTr
    ログが書き込まれないとのことなので確証は持てません。
    ユーザプロセスの実行時間の制限がされていないでしょうか。

    $ ulimit -a

    で確認してみてください。
    サーバの設定も実行している状況も全くわかりませんし、
    通常はログが残ると思いますけれども、とりあえずあたってみるのはこのあたりです。
  • id:snaa1d_1
    ありがとうございます。実行してみました。
    初期値は以下の通りでした。

    [root@localhost ~]# ulimit -a
    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    scheduling priority (-e) 0
    file size (blocks, -f) unlimited
    pending signals (-i) 16240
    max locked memory (kbytes, -l) 32
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    POSIX message queues (bytes, -q) 819200
    real-time priority (-r) 0
    stack size (kbytes, -s) 10240
    cpu time (seconds, -t) unlimited
    max user processes (-u) 16240
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited

    すいません、実行時間の制限がどれかわかりませんでした。
    怪しい箇所があれば教えていただければ幸いです。
    (曖昧な質問で申し訳ないのですが、コメントではなく質問でどんどん回答して頂いて結構です。ご遠慮なく)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません