コース一覧
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分

動かないスクリプトを直せ

中段 / 目安 30分

商店街の各店から届く日報を1つのファイルにまとめる作業を、鴫原さんは去年まで手で cat していました。今年になって、事務局にアルバイトで来ていた学生さんが「スクリプトにしておきましたよ」と置いていったそうです。

「その子がな、自分のパソコンで書いたやつを USB で持ってきてくれたんだ。動くって言っとった。だが、うちでは動かん」

打ってみると、こうなります。

プレーンテキスト

-bash: /opt/yumesaku/bin/nippou-matome.sh: Permission denied

「権限か? と思って中を見たんだが、書いてあることは間違っとらんように見える。わしにはこれ以上分からん」

スクリプトが動かないときの理由は、たいてい中身ではなく外側にあります。今日はその外側を見ます。

ファイルは「実行してよい」と印がついていないと動かない

Linux では、ファイルが実行できるかどうかは中身では決まりません。ファイルに付いている実行の許可で決まります。見るには ls -l です。

ターミナル

ls -l /opt/yumesaku/bin/nippou-matome.sh

先頭に -rw-r--r-- のような10文字が出ます。2文字目から3文字ずつで、所有者・グループ・その他の許可を表します。r が読み、w が書き、x が実行です。x が1つも無ければ、そのファイルは誰にも実行できません。Permission denied はこれを言っています。

実行の許可を足すのが chmod です。

ターミナル

chmod +x /opt/yumesaku/bin/nippou-matome.sh

+x は「実行の許可を足す」という意味です。数字で chmod 755 と書く流儀もあります。どちらでも結果は同じところに着きます。

1行目がスクリプトの行き先を決めている

実行の許可を足しても、まだ動かないことがあります。今度は別のことを言われます。

プレーンテキスト

-bash: /opt/yumesaku/bin/nippou-matome.sh: /usr/bin/env: bad interpreter: No such file or directory

スクリプトの1行目には、そのファイルを誰に読ませるかが書いてあります。#! で始まるこの行をシェバンと呼びます。

ターミナル

#!/bin/bash

カーネルはこの行を読み、書かれているプログラムを起動して、そこにスクリプトの中身を渡します。だから #! の後ろに書いてあるパスが実在しなければ、当然そこで止まります。bad interpreter はそういう意味です。

人によって環境が違うので、書き方も分かれます。#!/bin/bash はパスを直接指すやり方、#!/usr/bin/env bash は env に探させるやり方です。どちらを書くにしても、その機械に実在するパスでなければ動きません。実在するかは次で確かめられます。

ターミナル

ls -l /bin/bash which bash

1行目だけを見るなら head -1 が早いです。

ターミナル

head -1 /opt/yumesaku/bin/nippou-matome.sh

完成条件

  1. /opt/yumesaku/bin/nippou-matome.sh が、フルパスで打つだけで動くこと
  2. 実行すると、/var/yumesaku/nippou の中にある日報を1つにまとめ、/root/nippou-matome.txt に書き出すこと。この処理そのものはスクリプトの中に既に書かれています
  3. スクリプトの中身の処理は書き換えないこと。直すのは動かない原因だけです

進め方

まず ls -l で外側を見て、次に head -1 で1行目を見てください。エラーメッセージは正確に読むと、それだけで原因の半分を教えてくれます。

ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

課題

  1. /opt/yumesaku/bin/nippou-matome.sh がフルパスで打つだけで動くこと
  2. 実行の許可が付いていること
  3. 1行目のシェバンが、この機械に実在するパスを指していること
  4. 実行した結果として /root/nippou-matome.txt に3店ぶんの日報がまとまっていること
  5. スクリプトの中身の処理は書き換えないこと

ヒント

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

①方針 スクリプトが動かない理由は中身ではなく外側にあります。原因は1つとは限りません。1つ直したらもう一度実行し、次に出たエラーを読んでください

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
  • 1. ls -l でスクリプトの許可を見る
  • 2. chmod +x で実行の許可を足し、もう一度実行してみる
  • 3. 次に出たエラーを読み、head -1 で1行目を見る
  • 4. which bash でこの機械の bash の場所を調べ、1行目を書き換える
  • 5. もう一度実行して /root/nippou-matome.txt ができたことを確かめる

5 項目で採点します