久しぶりにJavaでプログラミングをしています。Processを使ったものなのですが、最近はProcessBuilderというものがあるのですね。
前から、子プロセスの標準入出力と標準エラー出力をきちんと使うようなプログラムにしたいと思っていたので、今回結構調べてみたのですが、結構大変そうです。やはりシェルのようなものをJavaで実装するのは厳しそうな感じがしました。できるだけ汎用的に作るためには、ストリームはバイト列で扱うような形にするとよさそうでしたが、BufferedReaderとかを使った方があきらかにプログラミングの方は楽なので、用途ごとに使い分けることにして、今回必要だと思われる機能だけに絞り込むことにしました。
注意点として、子プロセスの標準入出力と標準エラー出力は親プロセスからの参照がなくなっても残る、といったことがAPIに載っていたので、とりあえず、プロセスの実行結果 exitValue() を取得した後に、それらを close() するようにしてみました。動かしてみても、特に例外は発生してこないので、きちんと動いていると考えてよさそうです。
今回用意しているプログラムは、root権限で実行しないといけないコマンドをリモートからキックしたい、ということで用意しています。最初、root権限で実行すればいいかな、と思ったのですが、sudoコマンドをうまく使えば、ネットワークで待機するプログラム自体はroot権限で実行しなくても良さそうです。結局のところセキュリティを確保するためにSELinuxを導入しているので、面倒なことが多くなっているのですが、こうやって穴となる部分を最低限に絞り込むためには仕方がありません。どこで穴を開けて、その穴をどれだけ防御しておくか、というのがポイントになってくるので、適切な設計と設定をしたいところです。
ネットワーク経由で使いやすくするために、すごく簡単なWebインタフェースもつけてみました。1日に数回程度のアクセスしか想定していないので、Jettyを使っています。こういう軽量コンテナはやっぱり便利ですね。もちろんServerSocketとかを使って実装することもできるのですが、手間や安定性を考えると、あるものをそのまま使った方が、断然楽です。
ということで、それなりに時間もかかりましたが、いろいろなところで使えそうなソフトウェアができあがりました。これにアクセスする側のプログラムを次に作ろうと思うのですが、PHPで実装するか、Javaで実装するか、ちょっと悩んでいます。PHPを使って簡単に実装すればいいのですが、DBを使いたいとも思っていて、そうするとJavaの方が何かといいかな、と思うわけです。PHPではDBアクセスの方法がバージョンによっても違うのが気になっています。稼動させるプラットフォームとして考えているOSや環境はこれ、と決まっているわけではないので、できるだけ運用時には設定変更だけで対応できるようなつくりとしておきたいのです。そうすると、やっぱりJavaかなぁ。
ま、結局なれたものを使うということになる、というだけの話かもしれません。ちょっと休んでから、作業を再開するか。