- - PR -
Linuxへのpsコマンド実行でゴミ行が表示される?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-03-16 13:48
連日投稿させて頂きます、ごんたです。
先日の投稿「JavaからLinuxマシン内のプロセスを操作する方法について」は、 複数アドバイス頂き解決したかに思えたのですが、そこで別の問題が発生してしまいました。 javaプログラムで、Runtime.execを使用して、”ps -ax |grep プロセス名”のコマンド 起動により、稼動中のプロセス名を取得する、って事をやってみたのですが、 不可思議な現象が発生しました。 <実行一回目> 8284 ? S 0:00 pgreplicateA 15576 ? R 0:00 /bin/sh -c ps -ax |grep pgreplicateA <実行二回目> 8284 ? S 0:00 pgreplicateB 15580 ? S 0:00 /bin/sh -c ps -ax |grep pgreplicateB 15582 ? S 0:00 grep pgreplicateB <実行三回目> 8284 ? S 0:00 pgreplicateC 15576 ? R 0:00 /bin/sh -c ps -ax |grep pgreplicateC 上記は、javaにて”ps -ax |grep pgreplicate”をループ実行させた結果なのですが 二回目の最終行の様に、ゴミの行(?)が出力されてしまう事があります。 割合的には4、5割くらいで、結構頻発していますが、手動で同じコマンドを入力しても 同じ現象は発生しません。 grep結果の編集方法次第では、ゴミの行が出たとしても、プロセス名が出力された行の 特定は出来ますが、出来れば原因を突き止めたいな、と思っております。 どなたか、原因をご存知の方、同現象の経験がある方いらっしゃれば、アドバイスお願い いたします。 | ||||
|
投稿日時: 2007-03-16 14:14
"ps -ax |grep pgreplicate"を実行したとすると、 /bin/sh -c ps -ax |grep pgreplicateB ps -ax grep pgreplicateB という3つのプロセスが実行される事になります。 psが/procをトラバースしている間にgrepが起動される状況になると思うので、 タイミングによっては/bin/sh以外のプロセスも引っかかってしまうのでしょう。 grepを結果に含めたくないのならば、Runtime.execを行った Java側で絞り込みをすれば不要な出力は現れなくなります。 他にも、多少移植性は損なわれますが(Redhatなら確実にあるはず)、 /sbin/pidofという目的にぴったりなコマンドもあります。 こちらは引数で指定された名前に一致するpidを全て列挙します。 | ||||
|
投稿日時: 2007-03-16 14:18
それはそういうものです。手打ちで確認できなかったのは、たまたまでしょう。
「ゴミ」を除去したければ、grepの結果を更にgrepします。詳しくはman grepしてください。 ところでJava Solution会議室で、psやprepの結果について質問するのはどうかと思います。 | ||||
|
投稿日時: 2007-03-16 14:44
ごんたです。早速アドバイス頂きありがとうございます。
toあしゅ様 了解しました。java側で絞り込む方向でやりかけていましたが、教えて頂いたpidofコマンド が目的ぴったりの機能を持っていましたので、pidofを使用する事にしました。 (事前調査が足りませんでした。お手間をとらせて申し訳ありません) toやじゅう様 たまたま手動入力で現象が発生しなかった為、Javaプログラムでのコマンド発行時の問題 かもと思い、続けてこちらに投稿させて頂きました。 しかしながらおっしゃる通り、Linuxコマンドの結果が問題である事を考慮すると、別会議室 で質問すべきだったかもしれません。以降、その点を注意して投稿する様にします。 とにかく、連日丁寧にご回答頂き、ありがとうございました。 |
1