- - PR -
Tomcatとシェルに関して
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-01-18 02:00
こんにちわっ! ゆうゆうです。
初耳です^^; ただ、よく読むと「プログラム名は拾えるけど、コマンドパラメータが拾えない」というもののようです。よって、起動していること自体は確認できそうですね。起動直後のプロセスがスワップアウトされることがなさそうなのは、ぽんすさんと同意見ですし(笑)
これはこの件だけでは判断できないと思います^^; 一応簡単にpsコマンドのソース確認もしたのですが、psコマンドは「/proc/」以下のプロセス情報を拾ってきてそれを整形して表示しているだけでした。つまり、カーネルから直接情報を拾ってきているわけではないのです。 …で、psコマンド側で出力時に変更しているのかなとも思ったのですが、そういう部分はちょっと見つかりませんでした^^; よって、カーネル側で「/proc/」以下へ出力時に「cmdline」を編集しているのではないかなと思います。 …で、「/proc/」以下をさらに調べてみました。(STATにWがついてるのがスワップアウト状態です) -----------------------------PS出力--------------------------------- USER PID STAT COMMAND root 1 S init [3] root 2 SW [keventd] root 3 SW [kapmd] root 4 SWN [ksoftirqd_CPU0] root 5 SW [kswapd] root 564 S syslogd -m 0 -----------------------------PS出力--------------------------------- -----------------------------cmdline-------------------------------- cat /proc/1/cmdline -> init [3] cat /proc/2/cmdline -> (なし) cat /proc/3/cmdline -> (なし) cat /proc/4/cmdline -> (なし) cat /proc/5/cmdline -> (なし) cat /proc/564/cmdline -> syslogd-m0 -----------------------------cmdline-------------------------------- …となっていました。このことから、カーネルから出力される「/proc/」以下の情報が編集されていると推測され、カーネル上からは情報を削除されていないことになります。(カーネル上から情報が削除されていると「cmdline」情報を保持する場所がなくなってしまうため) 自分的にはこういう意見になったのですが、どこか間違っているでしょうか^^; なにかご指摘あればよろしくお願いしますm(..)m | ||||||||||||||||
|
投稿日時: 2004-01-18 04:35
お二人の意見に賛成します。今回の用途ならpsの出力も使えますね。 この件で、Java特有の事情についてちょっとだけ詳しくフォローをば。 # というより、後から他の方がこのスレッドを見たときのための補足説明、かな。 TomcatはJava上で動作するわけで、 手元のRedHat9+J2sdk1.4.1_05+Tomcat5.0.16では、 プログラムが「/usr/java/j2sdk1.4.1_05/bin/java」 コマンドパラメータが「-Djava.endorsed.dirs=/usr/jakarta-tomcat-5.0.16/common/endorsed -classpath /usr/java/j2sdk1.4.1_05/lib/tools.jar:/usr/jakarta-tomcat-5.0.16/bin/bootstrap.jar:/usr/jakarta-tomcat-5.0.16/bin/commons-logging-api.jar -Dcatalina.base=/usr/jakarta-tomcat-5.0.16 -Dcatalina.home=/usr/jakarta-tomcat-5.0.16 -Djava.io.tmpdir=/usr/jakarta-tomcat-5.0.16/temp org.apache.catalina.startup.Bootstrap start」 になります。 なので、(今回の用途では考慮しなくてよいのですが)スワップアウトされたときは コマンドパラメータは不明になるわけですから、tomcatがどうか判別できなくなります。 (正確には、他にJavaVMのプロセスが動作している場合で、そのプロセスも スワップアウトしている場合、どれがTomcatのプロセスなのか区別が できなくなります) [ メッセージ編集済み 編集者: ちいにぃ 編集日時 2004-01-18 10:41 ] | ||||||||||||||||
|
投稿日時: 2004-01-18 11:25
え〜と、例によって説明をすっとばしてしまいましたが... procファイルシステムはカーネルの中の情報を持っています。 ある情報をprocファイルシステムから読み出すのと、システムコールを 利用してカーネルに問い合わせるのとは同じ結果となります。
2から5まではカーネルプロセスで、ユーザプロセスを持っていないので 特殊な扱いがあるかと思います。 プロセスに関する情報は、カーネルの task_struct 構造体と カーネルスタックとに収められています。 プロセスがスワップアウトしたならばカーネルスタックは ページアウトしてしまってよいと思いますが、プロセスに与えられた 引数の情報はここに入っているのかな? そうじゃなかろうかと思うのですが、そうなるとメモリから直接 読み出すことができなくなって、それでpsコマンド等で表示されなく なるのではないかと... うーん、詳しい方に教えて頂けるとありがたいですねえ。 | ||||||||||||||||
|
投稿日時: 2004-01-18 12:55
こんにちわっ! ゆうゆうです。
#本日はカーネル周りの資料を職場においてきてしまってがっかりです^^; #Linuxはちまちまと勉強中なもので…
なるほど。おっしゃるとおりですね。トラブルをさけるといった意味でもpsコマンドの利用はさけた方が良さそうですね。(利用が必ずしも起動直後のチェックに限定されるならよいのですが…。特にjava関係のアプリはトラブルの元になりそうですね^^;)
なるなる。「/proc/」以下の情報はカーネルのメモリ情報と同期がとれているってことですね。勉強になります。
1のinitもカーネルプロセスではないのでしょうか?^^; 自分の記憶では「すべてのデーモンはinitから起動されていてる=2〜5と同様なカーネルプロセス」なイメージを持っていたもので…。もし、1がカーネルプロセスなら単純にユーザプロセスとカーネルプロセスの比較ってわけにはいかないかと思うのですが…。
いえ、ぽんすさんには十分勉強させていただいているんで助かります(^^) 明日、職場へ行ったらちょっと調べてみようかと思います。私の知識で理解できれば…ですが^^; | ||||||||||||||||
|
投稿日時: 2004-01-18 14:17
> 2から5まではカーネルプロセスで、ユーザプロセスを持っていないので
> 特殊な扱いがあるかと思います。 そもそも、カーネルプロセスにはcmdline自体が無いので、cmdlineが空なのは当然ですね。 | ||||||||||||||||
|
投稿日時: 2004-01-18 17:08
init はOS起動後に生成されるすべてのプロセスの親であったり
先祖であったりするもので、親のないプロセスをひきとって 面倒をみることもするし、たしかに特別なプロセスではあるの ですが、それでもこれはユーザプロセスです。 デーモンの親がinitになっていることがふつうなのはなぜかというと... 「端末でCtrl-Cを叩いたらデーモンが終了しちゃった」なんてのは うれしくないので、通常のデーモンプロセスは端末から切り離されて います。(そうでないこともあります) それを保証するために行う手順の中で「forkして、親はすぐexitする」 というのがあるので、子であるデーモンプロセス(この時点ではまだ デーモンとしてのプログラムは動いていないが「将来の」デーモン)は 親がいなくなったのでinitにひきとられます。 とゆーわけです。 # デーモンに関して追記 [ メッセージ編集済み 編集者: ぽんす 編集日時 2004-01-18 17:41 ] | ||||||||||||||||
|
投稿日時: 2004-01-19 01:46
こんばんわっ! ゆうゆうです。
貴重なお時間を割いていただいた上に、いろいろとお教えいただきありがとうございますm(..)m
なるほど。そうだったんですね〜。今更ながら気がついたのですが、なんか、カーネル関係って「k〜」で始まるものが多い気がするのですが…。Cの関数を含めて^^; 慣用的にそうする習慣があるんでしょうね(^^)
単純にinitから起動されていると思っていた(私の昔読んだ解説本ではinitから起動されるとしか書いてなかったので^^;)のですが、実はそういう仕組みになっていたんですね。わかりやすい説明でとても助かります。 あんまり聞いてしまうのもあれですので^^; これ以上は自分でもう少し調べてみますね(^^) 私の疑問に対して丁寧にお教えいただき本当にありがとうございました。また、何かありましたらよろしくお願いします〜m(..)m |
«前のページへ
1|2|3