暴走プロセスを止めろ
中段 / 目安 25分
事務局のサーバーが、朝から異様に遅くなりました。ls を打つだけで一拍待たされます。ディスクは空いています。前の問題で片づけたばかりです。
「今度は容量じゃない。何かが回りっぱなしだ」と鴫原さん。「ゆうべ、店の会員ポイントを外部と突き合わせる仕組みを試したんだ。あれが悪さしとるかもしれん。ただな、同じ場所にもう1本、止めてはいけないやつが動いとる。夜間バックアップの見張りだ。あれを殺したら明日の朝までバックアップが取れん」
つまり、動いているものを片っ端から止めるのは不正解です。どれが暴走しているのかを見分けてから、その1本だけを止める。 これが今日のお題です。
動いているものを見る
実行中のプロセスを一覧するのが ps です。単体で打つと自分の端末のぶんしか出ないので、システム全体を見るときはオプションを付けます。よく使う形は次の通りです。
ターミナル
ps aux
ps -eo pid,pcpu,args-eo は「全プロセスを、指定した列だけで出す」という指定です。pid は識別番号、pcpu はCPU使用率、args は起動したときのコマンド行です。この args が要になります。プロセス名だけを見ると sh としか出ませんが、args まで出せばどのスクリプトを動かしている sh なのかが分かります。
CPUを食っている順に並べたいなら、--sort=-pcpu を付けます。マイナスは降順です。
ターミナル
ps -eo pid,pcpu,args --sort=-pcpu | head -5top でも同じことが見えます。対話的に上位が並び続けるので、様子を眺めるのに向きます。q で抜けます。
止める
止めるのは kill です。引数は識別番号です。
ターミナル
kill <PID>これは「終わってくれ」という穏やかなお願い (TERM) で、行儀のよいプログラムは後片付けをしてから終わります。それでも居座るときだけ、有無を言わせない kill -9 <PID> を使います。最初から -9 を使う癖は付けないでください。 書きかけのファイルを道連れにします。
名前で止める pkill -f <文字列> もありますが、この問題では危険です。 指定した文字列に部分一致したものを全部止めるので、雑に指定すると止めてはいけないほうまで巻き込みます。使うなら、巻き込まない文字列かどうかを pgrep -f で先に確かめてください。pgrep は止めずに、一致するPIDを見せてくれます。
完成条件
- CPUを食い続けている暴走プロセスを止めること
- 夜間バックアップの見張り (
backup-watch) は動いたまま残すこと - 止めたプロセスのコマンド行が分かる形で
/root/teishi.txtに記録を残すこと。スクリプトの名前が含まれていれば足ります
進め方
止める前に、必ず両方を見分けてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
本番のサーバーでこれをやるとき、慌てて広く止めた人は必ず二次障害を起こします。見分けてから1本だけ止める。この順番が身に付けば、この問題の値打ちは出ています。
課題
- CPUを食い続けている暴走プロセスを止めること
- backup-watch は動いたまま残すこと
- 止めたプロセスの記録を /root/teishi.txt に残すこと
- 片っ端から止めるのではなく、見分けてから止めること
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです