マクロコマンド「scpsend」でファイル転送終了を確認するには?

Tera Term(テラターム)のマクロコマンド「scpsend」を使用してサーバへ
ファイル送信する事ができる事はみなさんご存知ですよね。

先日「scpsend」でファイルをサーバに送信し、ファイル転送の終了を待って
あるコマンドを実行したいが何か方法が無いかとの相談を受けました。

「scpsend」の解説を確認すると以下のように書かれていました。

ファイル<filename>をSCP(Secure Copy Protocol)プロトコルで送信する。
転送先を省略した場合は、ファイルはリモートホストのホームディレクトリへコピーされる。送信が終わるのを待たずに、次のコマンドを実行することができる。

『送信が終わるのを待たずに、次のコマンドを実行することができる。』がちょっとした肝ですね。

ファイル送信の処理を実行し、終了を待たずして次のコマンドが実行出来るのは便利なのですが、もし以下のようなマクロを書いてしまうとタイミングによってはファイル送信完了前にマクロが終了してしまったり、ファイルの送信は完了するが後続のマクロが動かない等、思い通りの動作をしない事があります。

;; ファイル送信
scpsend SOURFILE DESTFILE
mpause 1000
sendln 'exit'
;; マクロ終了
end


そこで苦肉の策なのですが、以下のマクロサンプルを追加する事で、
ファイル転送の終了を確認する事ができましたのでここでご紹介致します。

内容としましては「scpsend」実行中は「scp -t」のプロセスが存在します。
このプロセスの終了を確認する事でファイル転送の終了を確認しています。

「scpsend」実行中のプロセス例)
$ ps -ef |grep scp
user01    15004 14982  0 20:05 ?        00:00:00 scp -t /tmp/test.txt
;; ファイル送信
scpsend SOURFILE DESTFILE
;; ファイル送信プロセス確認
do
  mpause 5000
  sendln ‘ps -ef |grep -v grep |grep -c scp’
  waitln0′ ’1loop while result != 1
;; ファイル送信が完了すると次のマクロを実行
sendln 'exit'
;; マクロ終了
end


これでファイル送信が終了してからコマンドを実行したり、ちゃんとファイル転送が終了するのを待ってからマクロを終了する事が可能になります。

しかしこれにも欠点があります。
もし他の人が同じ時間帯にSCPでファイル転送を実行していると、その処理が終了するまでファイル転送中のステータスとなってしまいます。もし容量の大きいファイルを転送してたりすると、その処理が終わるまで待つことになってしまいます。

実行するユーザが違えば、以下のように修正する事でカバーできますが・・・。

sendln ‘ps -ef |grep -v grep |grep scp |grep -c ユーザ名’

将来的には、引数などでファイル送信の終了を待てるようするとか、
ファイル送信の正常性を戻り値で取得できるようになったら便利になりますね。

まあ何かの参考にでもなれば幸いです。

スポンサーリンク

同じカテゴリーの記事(皆さんこんな記事も読まれています!)

4 Responses to “マクロコマンド「scpsend」でファイル転送終了を確認するには?”

  1. ゆたか より:

    情報どうもありがとうございます。マクロスクリプトに追加させていただきました。
    http://ttssh2.sourceforge.jp/manual/ja/macro/command/scpsend.html

    非同期ではなく、同期してファイル転送できるように、将来的にはしたいと考えています。

    • 大伯力 より:

      ゆたかさん。こんばんは。
      ちょっとでもお役に立てたのであれば幸いです。
      同期しての転送楽しみにしています。

  2. hirsh より:

    以下のようにしたら、私の使っているサーバではできました。
    (ttyを基にsshログインユーザの親PIDを特定して、正しいscpプロセスをチェックしています)
    ご参考までに。

    ;; ファイル送信プロセス確認
    do
    mpause 5000
    sendln ‘ps -ef | grep `ps -ef | grep “[\`whoami\`]@${SSH_TTY##/dev/}” | awk “{print \\$2}”` | grep -c scp’
    waitln ‘0’ ‘1’
    loop while result != 1

    • 大佐古潤三 より:

      hirshさん。

      情報ありがとうございます。
      早速試してみたいと思います。

コメントを残す

このページの先頭へ