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’
  waitln ’0′ ’1′
loop while result != 1
;; ファイル送信が完了すると次のマクロを実行
sendln 'exit'
;; マクロ終了
end

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

しかしこれにも欠点があります!

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

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

sendln ‘ps -ef |grep -v grep |grep scp |grep -c ユーザ名’
スポンサーリンク

おわりに

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

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