コース一覧
Linux道場 商店街サーバー障害対応の10問
暴走プロセスを止めろ

Linux道場 商店街サーバー障害対応の10問

Linux入門で身に付けた技を、商店街事務局のサーバー当番として試す演習専用コースです。解説はありません。障害の報告と復旧条件だけを読み、原因を自分で突き止めて直します。手が止まったときのために、方針・使うコマンド・部分解の3段階のヒントを各問に用意しています。他の道場と違い、白紙から書き始めるのではなく、すでに壊れている機械の前に座るところから始まります。ブラウザの中で本物の Debian が動いていて、打ったコマンドはそのまま本物の機械に効きます。迷子のファイル探しから始まり、ログからの原因特定、権限、ディスク不足、暴走プロセス、PATH、スクリプトの起動失敗、定期実行の停止、バックアップからの復元と進み、最後は複数の障害が同時に起きたサーバーを健全な状態まで戻します。1問15分から45分、全10問で約5時間です。Linux入門を終えて「コマンドは知っているが、壊れた機械を前にすると手が止まる」と感じている方に向いています。

1
初段
01. 迷子のファイルを探し出せ15分
02. ログから犯人を特定せよ20分
03. 開けないファイルを開けろ20分
04. ディスクを空けろ25分
2
中段
01. 暴走プロセスを止めろ25分
02. コマンドが見つからない30分
03. 動かないスクリプトを直せ30分
3
師範
01. 定期実行が動かない理由を突き止めろ30分
02. バックアップから復元せよ35分
03. 総合 サーバー健全化ミッション45分

暴走プロセスを止めろ

中段 / 目安 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 -5

top でも同じことが見えます。対話的に上位が並び続けるので、様子を眺めるのに向きます。q で抜けます。

止める

止めるのは kill です。引数は識別番号です。

ターミナル

kill <PID>

これは「終わってくれ」という穏やかなお願い (TERM) で、行儀のよいプログラムは後片付けをしてから終わります。それでも居座るときだけ、有無を言わせない kill -9 <PID> を使います。最初から -9 を使う癖は付けないでください。 書きかけのファイルを道連れにします。

名前で止める pkill -f <文字列> もありますが、この問題では危険です。 指定した文字列に部分一致したものを全部止めるので、雑に指定すると止めてはいけないほうまで巻き込みます。使うなら、巻き込まない文字列かどうかを pgrep -f で先に確かめてください。pgrep は止めずに、一致するPIDを見せてくれます。

完成条件

  1. CPUを食い続けている暴走プロセスを止めること
  2. 夜間バックアップの見張り (backup-watch) は動いたまま残すこと
  3. 止めたプロセスのコマンド行が分かる形で /root/teishi.txt に記録を残すこと。スクリプトの名前が含まれていれば足ります

進め方

止める前に、必ず両方を見分けてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

本番のサーバーでこれをやるとき、慌てて広く止めた人は必ず二次障害を起こします。見分けてから1本だけ止める。この順番が身に付けば、この問題の値打ちは出ています。

課題

  1. CPUを食い続けている暴走プロセスを止めること
  2. backup-watch は動いたまま残すこと
  3. 止めたプロセスの記録を /root/teishi.txt に残すこと
  4. 片っ端から止めるのではなく、見分けてから止めること

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 何が動いているかを一覧し、CPU使用率の高い順に並べます。プロセス名だけでは sh としか出ないので、起動したコマンド行まで出して見分けます

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
  • 1. ps でCPU使用率の高い順に並べる
  • 2. コマンド行まで出して、暴走しているほうと見張りのほうを見分ける
  • 3. 止める前に、止めるプロセスの記録を /root/teishi.txt に残す
  • 4. kill で暴走しているほうの PID だけを止める
  • 5. ps でもう一度並べ、見張りが残っていることを確かめる

3 項目で採点します