ページ

2012-12-09

netcatで良い感じにログをアレする


初めてnetcatに触れて、感動したので記事にしました。

結論から先に言いますと、netcatに対してパイプしてドーンすると凄く幸せでした。

条件

  1. ログを標準出力にバシバシ吐くプログラムがある
  2. 上のプログラムを長時間動作させ、そのログを1GBぐらい取りたい
  3. しかし、上のプログラムの実行環境の空き保存容量は少なく10MBも無い
  4. 上の実行環境に自分のPCとEthernet経由で接続することが出来る
  5. 実行環境はLinuxでnetcat(ncコマンド)が使える
という条件。

まとめて言うと、「保存容量が限られているLinuxマシンで大量のログを取りたい、但しネットワークは自由に使っておk」という条件。

空き容量が少ない、というのは組み込みだと有りがちで、ハードディスクなんて巨大なものは付いて無くてRAMのみ、しかも全部の容量をあわせて16MBって環境はザラです。

問題点

command > command.log
とかで、ログを実行環境に保存してから後でFTPで取ろうとか考えても、そもそもログを保存しておくスペースが無い。

即座に悲しいことになる。

考えてみる


解決策その1


全部のログを一度に保存することは無理なので、2MBぐらいに分けてそのたびにFTPで取得して、そのログを消せば?

解決策その1への答え


ログが消え去る恐れがある為、ダメ

例えば、この方法ではログを回収→ログをクリア(ファイルサイズを0にする)→ログを回収→ログをクリア・・・・
という手順を繰り返すことになるが、ログを吐いているプログラムと同期する仕組みが用意されていないので、どのタイミングでログをクリアして良いのかが分からない。

ログの回収後下のコマンド等でログのファイルをクリアすると思われるが、FTPで回収してから下のコマンドが実行されるまでに書き込まれたログは消え去ることになる。
echo -n "" > command.log
これではダメだ。もしもその消え去ったログが重要なものであったら悲しいことになる。

解決策その2


ログが消え去るのが怖いんだったら、ログの回収中は一旦プログラムを終了して、ログのクリアが終わったら再びプログラムを起動すれば?

解決策その2への答え


長時間動作させた時のログが欲しいので却下

解決策その3


じゃあもうネットワーク越しにログを送信するプログラム書いてそいつを経由して回収しろよ!

解決策その3への答え


マテヨ?

それnetcatで出来るんじゃね??


本命の解決策


netcat(以下nc)はLinuxに搭載されている神の作りしツールの一つです。

ネットワーク越しに大抵のことをやってのけます。
その万能さ故、ウイルスとみなされることもしばしばあります。

このncはサーバ状態で起動することが出来ます。
この機能を使ってさっきのログを出力するサーバとして起動します。
例えばポート10000番でリッスンするサーバとして起動する場合は以下のようにします。
command | nc -l -p 10000
後はこのサーバに接続してログを読んであげれば終了です。

今になって思ったけど、自分のPC側に鯖を立てて、ncでログを送信するほうが良かったかもしれないですね・・・

上記のように使用する場合は
command | nc <送信先IPアドレス> <送信先ポート>
とやれば大丈夫です。

netcatをサーバとして起動して、パイプで標準出力を受け取っているとバッファが溢れて、結局ログが捨てられることになってしますので、受け取り側の準備が出来た後にnetcatを使ってログを送信するほうがよさそうです。

そんなこんなで新たな反省点が見つかりましたけど、netcatの万能さはお分かりいただけたでしょうか?

「ソケットで通信する機能を実装するのめんどくせー」って思ったときは、是非netcatを応用して何とか出来ないかを考えてみるといいと思います。

サーバにもクライアントにもなれるので凄く万能なコマンドだと思います。

0 件のコメント:

コメントを投稿