- PR -

Tomcatとシェルに関して

投稿者投稿内容
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-01-18 02:00
こんにちわっ! ゆうゆうです。
引用:

ちいにぃさんの書き込みより引用:

いうスレッドにて、プロセスがスワップアウトされるとpsの出力が変化する、
とあります。



 初耳です^^; ただ、よく読むと「プログラム名は拾えるけど、コマンドパラメータが拾えない」というもののようです。よって、起動していること自体は確認できそうですね。起動直後のプロセスがスワップアウトされることがなさそうなのは、ぽんすさんと同意見ですし(笑)

引用:

ぽんすさんの書き込みより引用:

プロセスがスワップアウトするとカーネル側の情報も
主記憶からはある程度消されるということなんでしょうね。



 これはこの件だけでは判断できないと思います^^; 一応簡単に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
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-01-18 04:35
引用:

水無月 遊々さんの書き込み (2004-01-18 02:00) より:

 初耳です^^; ただ、よく読むと「プログラム名は拾えるけど、コマンドパラメータが拾えない」というもののようです。よって、起動していること自体は確認できそうですね。起動直後のプロセスがスワップアウトされることがなさそうなのは、ぽんすさんと同意見ですし(笑)



お二人の意見に賛成します。今回の用途なら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 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-01-18 11:25
引用:

水無月 遊々さんの書き込み (2004-01-18 02:00) より:
psコマンドは「/proc/」以下のプロセス情報を拾ってきてそれを整形して表示しているだ


え〜と、例によって説明をすっとばしてしまいましたが...
procファイルシステムはカーネルの中の情報を持っています。
ある情報をprocファイルシステムから読み出すのと、システムコールを
利用してカーネルに問い合わせるのとは同じ結果となります。

引用:

-----------------------------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出力---------------------------------


2から5まではカーネルプロセスで、ユーザプロセスを持っていないので
特殊な扱いがあるかと思います。

プロセスに関する情報は、カーネルの task_struct 構造体と
カーネルスタックとに収められています。
プロセスがスワップアウトしたならばカーネルスタックは
ページアウトしてしまってよいと思いますが、プロセスに与えられた
引数の情報はここに入っているのかな?
そうじゃなかろうかと思うのですが、そうなるとメモリから直接
読み出すことができなくなって、それでpsコマンド等で表示されなく
なるのではないかと...

うーん、詳しい方に教えて頂けるとありがたいですねえ。
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-01-18 12:55
こんにちわっ! ゆうゆうです。

#本日はカーネル周りの資料を職場においてきてしまってがっかりです^^;
#Linuxはちまちまと勉強中なもので…

引用:

ちいにぃさんの書き込みより:

コマンドパラメータは不明になるわけですから、tomcatがどうか判別できなくなります。



 なるほど。おっしゃるとおりですね。トラブルをさけるといった意味でもpsコマンドの利用はさけた方が良さそうですね。(利用が必ずしも起動直後のチェックに限定されるならよいのですが…。特にjava関係のアプリはトラブルの元になりそうですね^^;)

引用:

ぽんすさんの書き込みより:

procファイルシステムはカーネルの中の情報を持っています。
ある情報をprocファイルシステムから読み出すのと、システムコールを
利用してカーネルに問い合わせるのとは同じ結果となります。



 なるなる。「/proc/」以下の情報はカーネルのメモリ情報と同期がとれているってことですね。勉強になります。


引用:

ぽんすさんの書き込みより:

-----------------------------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出力---------------------------------
2から5まではカーネルプロセスで、ユーザプロセスを持っていないので
特殊な扱いがあるかと思います。



 1のinitもカーネルプロセスではないのでしょうか?^^; 自分の記憶では「すべてのデーモンはinitから起動されていてる=2〜5と同様なカーネルプロセス」なイメージを持っていたもので…。もし、1がカーネルプロセスなら単純にユーザプロセスとカーネルプロセスの比較ってわけにはいかないかと思うのですが…。

引用:

うーん、詳しい方に教えて頂けるとありがたいですねえ。



 いえ、ぽんすさんには十分勉強させていただいているんで助かります(^^)
明日、職場へ行ったらちょっと調べてみようかと思います。私の知識で理解できれば…ですが^^;
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2004-01-18 14:17
> 2から5まではカーネルプロセスで、ユーザプロセスを持っていないので
> 特殊な扱いがあるかと思います。

そもそも、カーネルプロセスにはcmdline自体が無いので、cmdlineが空なのは当然ですね。

ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-01-18 17:08
init はOS起動後に生成されるすべてのプロセスの親であったり
先祖であったりするもので、親のないプロセスをひきとって
面倒をみることもするし、たしかに特別なプロセスではあるの
ですが、それでもこれはユーザプロセスです。

デーモンの親がinitになっていることがふつうなのはなぜかというと...
「端末でCtrl-Cを叩いたらデーモンが終了しちゃった」なんてのは
うれしくないので、通常のデーモンプロセスは端末から切り離されて
います。(そうでないこともあります)
それを保証するために行う手順の中で「forkして、親はすぐexitする」
というのがあるので、子であるデーモンプロセス(この時点ではまだ
デーモンとしてのプログラムは動いていないが「将来の」デーモン)は
親がいなくなったのでinitにひきとられます。 とゆーわけです。
# デーモンに関して追記

[ メッセージ編集済み 編集者: ぽんす 編集日時 2004-01-18 17:41 ]
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2004-01-19 01:46
こんばんわっ! ゆうゆうです。
貴重なお時間を割いていただいた上に、いろいろとお教えいただきありがとうございますm(..)m

引用:

ですが、それでもこれはユーザプロセスです。


 なるほど。そうだったんですね〜。今更ながら気がついたのですが、なんか、カーネル関係って「k〜」で始まるものが多い気がするのですが…。Cの関数を含めて^^; 慣用的にそうする習慣があるんでしょうね(^^)

引用:

というのがあるので、子であるデーモンプロセス(この時点ではまだ
デーモンとしてのプログラムは動いていないが「将来の」デーモン)は
親がいなくなったのでinitにひきとられます。 とゆーわけです。


 単純にinitから起動されていると思っていた(私の昔読んだ解説本ではinitから起動されるとしか書いてなかったので^^;)のですが、実はそういう仕組みになっていたんですね。わかりやすい説明でとても助かります。

 あんまり聞いてしまうのもあれですので^^; これ以上は自分でもう少し調べてみますね(^^) 私の疑問に対して丁寧にお教えいただき本当にありがとうございました。また、何かありましたらよろしくお願いします〜m(..)m

スキルアップ/キャリアアップ(JOB@IT)