みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ftpのgetが正常できる方法について

約100Mバイトのログファイルの差分をとるため、下記のバッチファイルとteratermマクロを実行させました。
やり方は、差分をとりたい2つのログをfptにてサーバーへ転送し、サーバーでsdiffを実行し、差分結果をftpにてとってくるものです。

バッチファイル
 echo open xx.xx.xx.xx > "%~dp0put.txt"
 echo abcdef >> "%~dp0put.txt"
 echo pwabe >> "%~dp0put.txt"
 echo put log1 log1 >> "%~dp0put.txt"
 echo put log2 10g2 >> "%~dp0put.txt"
 echo quit >> "%~dp0put.txt"
 ftp -s:"%~dp0put.txt"
 del "%~dp0put.txt"
 "c:\ProgramFiles\teraterm\ttpmacro.exe" "%~dp0sdiff.ttl"
 cho open xx.xx.xx.xx > "%~dp0get.txt"
 echo abcdef >> "%~dp0get.txt"
 echo pwabc >> "%~dp0get.txt"
 echo get kekka kekka >> "%~dp0get.txt"
 echo del log1 >> "%~dp0get.txt"
 echo del log2 >> "%~dp0get.txt"
 echo quit >> "%~dp0get.txt"
 ftp -s:"%~dp0get.txt"
 del "%~dp0get.txt"
 exit/b

teraterm macro (sdiff.ttl)
 connect'xx.xx.xx.xx.:xx/ssh/2/auth=/user=abcdef/passwd=pwabc'
 wait'$'
 sendln 'sdiff logl log2 > kekka'
 sendln 'mv kekka kekka1'
 sendln 'perl -pe "s/\n\r\n/"kekka1 > kekka' 
 wait'$'
 sendln 'rm kekka'
 sendln 'rm kekka1'
 Sendln 'logout'
 end

ここから相談です。

ftpでgetしてきた差分は、ログの頭から3分の1程度しかなく、全ての差分をとることができませんでした。
調査したところ、サーバー側はログ全ての差分を取れていることを確認しました。
なぜ、ftpで作業結果をgetすると、3分の1しかないのか原因がわからないまま、試行錯誤で対処方法を見つけたのが次の方法です。

方法1(teraterm macroの変更1)
 次のようにwait'$'を追加する。
 sendln 'sdiff logl log2 > kekka'
 wait'$'
 sendln 'mv kekka kekka1'
 wait'$'
 sendln 'perl -pe "s/\n\r\n/"kekka1 > kekka'

方法2(teraterm macroの変更2)
 次のように20秒のpauseをとる。
 sendln 'sdiff logl log2 > kekka'
 pause 20
 sendln 'mv kekka kekka1'

方法1も方法2もタイミングを取るような方法ですが、このやり方で、なぜftpでgetした差分結果が正常(ログすべての差分が取れている)になるのかがわかりません。本当にこの対処でよいか判断できません。

どなたか上記方法でよい理由がお解りでしたら、教えてください。

投稿日時 - 2013-07-23 22:10:32

QNo.8188983

すぐに回答ほしいです

質問者が選んだベストアンサー

待ちが無い、ということは、キーの先行入力が行われている、ということになります。
先行入力されたコマンドが実際に実行されるのは、シェルの入力待ちになってからですが、TeraTermのマクロの実行は、明示しない限り先に進みます。

sendlnで送信されるのは一瞬です。

sendln 'sdiff logl log2 > kekka' → sdiffの実行が始まる
sendln 'mv kekka kekka1' → その間にキーの先行入力が行われる(一瞬)
sendln 'perl -pe "s/\n\r\n/"kekka1 > kekka' → その間にキーの先行入力が行われる(一瞬)
wait'$' → perlの終了待ちのつもりかもしれないが、実は、sdiffやmvの終了待ちになってしまっている
sendln 'rm kekka' → これが実行されているつもりが、実際は、前のコマンドが順番に実行されている途中。先行入力に溜るだけ
sendln 'rm kekka1' → これが実行されているつもりが、実際は、前のコマンドが順番に実行されている途中。先行入力に溜るだけ
Sendln 'logout' → これが実行されているつもりが、実際は、前のコマンドが順番に実行されている途中。先行入力に溜るだけ
end → logout後にttpmacro.exeを終了しているつもりが、実際は、前のコマンドが順番に実行されている途中。

ttpmacroが終了したので、ftpの実行開始
→ ttpmacroで実行すべきコマンドがまだ完了していないため、処理途中の状態のファイルをgetしている

ということでは。
waitを入れることで、プロンプトが表示される=コマンドが終了するのを待って、次のコマンドを実行するので、確実に処理が終った状態で、ftpのgetに進めるのだと思います。



あれ?
よく見ると、このマクロ、getしたいファイルまで消してしまってますよね。
ということは、rm kekkaを実行して、実際にアクセスできなくなるまでの微妙なタイミングでftpでget「できてしまっている」ようです。

投稿日時 - 2013-07-23 23:01:47

お礼

ご教授ありがとうございました。
理解できました。

>あれ?>よく見ると、このマクロ、getしたいファイルまで消してしまってますよね。>ということは、rm kekkaを実行して、実際にアクセスできなくなるまでの微妙なタイミン>グでftpでget「できてしまっている」ようです。

 すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
 実際は、rm kekkaはやっていません。

投稿日時 - 2013-07-24 20:26:14

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> sendln 'rm kekka'

せっかく作った差分ファイルを直後に消しているように見えますが。

他にも空白の欠けや意味不明のPerlコード(意味不明というかエラー)などもありますが、見ながら手打ちで投稿してタイプミスしたのですか?
コピーペーストで投稿した方が良いですよ。
不正確な情報ではアドバイス不能です。

投稿日時 - 2013-07-23 22:46:44

補足

>> sendln 'rm kekka'
>せっかく作った差分ファイルを直後に消しているように見えますが。

 すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
 コピーペーストするようにしたいと思います。

投稿日時 - 2013-07-24 06:31:51

お礼

>> sendln 'rm kekka'
>せっかく作った差分ファイルを直後に消しているように見えますが。

 すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
 コピーペーストするようにしたいと思います。

投稿日時 - 2013-07-24 06:32:19

あなたにオススメの質問