
約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した差分結果が正常(ログすべての差分が取れている)になるのかがわかりません。本当にこの対処でよいか判断できません。
どなたか上記方法でよい理由がお解りでしたら、教えてください。
No.2ベストアンサー
- 回答日時:
待ちが無い、ということは、キーの先行入力が行われている、ということになります。
先行入力されたコマンドが実際に実行されるのは、シェルの入力待ちになってからですが、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「できてしまっている」ようです。
ご教授ありがとうございました。
理解できました。
>あれ?>よく見ると、このマクロ、getしたいファイルまで消してしまってますよね。>ということは、rm kekkaを実行して、実際にアクセスできなくなるまでの微妙なタイミン>グでftpでget「できてしまっている」ようです。
すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
実際は、rm kekkaはやっていません。
No.1
- 回答日時:
> sendln 'rm kekka'
せっかく作った差分ファイルを直後に消しているように見えますが。
他にも空白の欠けや意味不明のPerlコード(意味不明というかエラー)などもありますが、見ながら手打ちで投稿してタイプミスしたのですか?
コピーペーストで投稿した方が良いですよ。
不正確な情報ではアドバイス不能です。
この回答への補足
>> sendln 'rm kekka'
>せっかく作った差分ファイルを直後に消しているように見えますが。
すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
コピーペーストするようにしたいと思います。
>> sendln 'rm kekka'
>せっかく作った差分ファイルを直後に消しているように見えますが。
すみません。都合があり、手入力で質問したため、余分に入ってしまいました。
コピーペーストするようにしたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル内置換
-
USBメモリ内のバッチで書き出す...
-
cron で rsync が実行できない
-
batが動かない
-
CPUとOS の違いは?
-
Postfixでmailコマンドを使用し...
-
ソフトのインストール場所って...
-
VBでExcelが起動されているか知...
-
エクセルVBA 実行時エラー 5029...
-
CSHが使えない REDHAT
-
バッチスクリプト処理でエラー...
-
OpenLDAPでのユーザ一覧表示
-
MySQL関連のパスを通すには
-
コマンドプロンプトの危険性を...
-
Basp21を使用してメール送信が...
-
CentOS X Window Systemエラー
-
ご教授願います PC初心者です。...
-
Ngraphについて
-
アプリケーションをインストー...
-
DebianのApache(掲示板)CGIエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メーリングリスト宛てのメール...
-
バッチファイル内置換
-
exeファイルの実行結果をテキス...
-
batファイル 行った履歴をテキ...
-
USBメモリ内のバッチで書き出す...
-
linuxのsshの反応が非常に遅い。
-
コマンド実行結果のファイル出力
-
batが動かない
-
cronを使って、CSVファイルのデ...
-
【Mac/Xcode】カレントディレク...
-
linux環境にて、ある特定の行に...
-
プログラムでTAを制御するコマ...
-
Mac OS ventura のapplescript...
-
コンソールアプリの入出力制御
-
時刻の同期について
-
バッチ処理(for文)について
-
PowerShellで自分が書いたコマ...
-
ソフトのインストール場所って...
-
バッチスクリプト処理でエラー...
-
フロッピーディスクの読み込み方法
おすすめ情報