新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: Re: TIME OUT
Date: 1998/01/28 04:13:27
Reference: mesh.npc.2/00211

1月27日に、たけちんさんは書きました。

>今まで何ともなかったのに今日突然「TIME OUT」ニなってしまいました。
>プロセステーブルやkillをすればよいとのことですがシェルが全然わからずどうすればいいか分からず困ってます。
>
たけちんさんのサーヴァはso-netですね。so-netはOSがSolaris 2.5.1で
ユーザサーヴァはApache/1.1.3を使っているようですね。

ふーむ、確かに10秒待ってからTIME OUTになっていますね。これは正常な
タイムアウト(って言うのも変ですが)で、ファイルロックが外れないまま
止まってしまったnpc.cgiがいて、そのためにカウンタファイルの更新が
出来ないでTIME OUTになっている可能性が高いです。

時折、サーヴァのファイルロック機構に問題が生じていてTIME OUTになって
しまう例もありますが、今回の場合、他のso-netユーザさんのnpc.cgiは
正常に動いていることから、サーヴァの問題とは考えづらいですからね。

# ホントにnpc.cgiが止まっているとしたら、確実に現象が捕捉できた
# 最初の例になるはず。

では、まずプロセステーブルを取ってみて下さい。
Solaris 2.5.1(SunOS 5.5.1)のpsコマンドオプションはよく分からないの
ですが、SunOS 4.1.3と同じなら、

ps -agxwwu

とすると、長いリストが得られます。もしもエラーになるようでしたら、

man ps

とすると、psコマンドのマニュアルが見られますので、その中で、
「全部のプロセス」とか「他のユーザが所有するプロセス」とか
「制御端末を持たないプロセス」とかのリストが得られるオプションを
指定して下さい。

# HP-UX だと ps -efl とかになるので、OSごとにオプションは
# 微妙に違うです。Solarisだと何になるんでしょうか? > Solarisユーザ

さて、プロセステーブルが得られたら、その中からnpc.cgiのプロセスに関する
情報を抽出するのですが、リストが長すぎて見つけるの大変でしょうから、
grep コマンドを使って見つけます。

まず、

ps -agxwwu > ps.txt

とかして、プロセステーブルをファイルに記録します。おそらくUnixのコマンドを
使うのは億劫でしょうから、ps.txtファイルをご自分のマシンに持ってきてから
エディタのサーチコマンドでnpcと言う文字列が含まれる行を探して下さい。

プロセステーブルの各欄の意味は最初の行に書いてあります。その中で、PIDと
書いてある欄が、そのプロセスのプロセスIDです。killコマンドを実行するには
これが必要になりますので、ここの数字を探して下さい。

例えば、プロセステーブルの出力例は以下のようになります。

USER       PID %CPU %MEM   SZ  RSS TT STAT START  TIME COMMAND
root         0  0.0  0.0    0    0 ?  D    Jan 17  1:31 swapper
root         1  0.0  0.0   52    0 ?  IW   Jan 17  0:06 /sbin/init -
 .
 .
www      17223 15.4  0.7  224  812 ?  S    03:41   0:00 /so-net/home/takechin/public_html/cgi-bin/npc.cgi
 .
 .

この例では、npc.cgiのPIDは17223と言うことになります。
最初の欄のUSERと言うのは、そのプロセスを実行したユーザ名ですが、サーヴァが
Apache/1.1.3だと、CGIプロセスは単一のサーヴァプロセスで実行されるはずなので
ユーザ名はたけちんさんのidであるtakechinではなく、wwwとかhttpdとかnobodyとか
多分そんな名前のはずです。

次にこのPIDを使ってプロセスをkillします。ただし、先ほども書いた様に、プロセスを
実行したUSERはサーヴァプロセスに割り当てられているユーザIDだと思われますので、
たけちんさんのidでkillしても有効になりません。そのためプロセスをkillするだけの
ごく簡単なCGIを書いて、それを実行します。

#!/bin/sh

kill -QUIT ここに今得られたPIDの番号を書く

echo "Content-Type: text/plain"
echo
ps -agxwwu

exit 0

と言うCGIを実行すると、プロセスのkillを実行して、npc.cgiがある
ディレクトリにcoreファイルを生成した後、プロセスリストを出力して終了します。
確かに指定したプロセスがkillされていることを確かめて下さい。それから、
正常にcoreファイルが生成出来るように、このCGIを実行する時には、
npc.cgiがあるディレクトリにその時だけサーヴァによる書き込み権限を
付けておいて下さい。通常は chmod 777 cgi-bin、で良いです。

# さて、プロセスkillの後、カウンタは復活したでしょうか?

あと、誠にお手数ですが、得られたプロセスリスト ps.txt と core ファイルを
送っていただけないでしょうか? Solarisは手元に無いので急には無理ですが、
機会があったら止まった原因を解析してみたいので。