Welcome

CLI Exercise Case PackCLI操作演習案件パック

演習用 / Linux・Windows CUI共通

「案件」を受けて、CLI(キーボードでコマンドを打って操作するやり方)で一次対応する練習

ここまでのCUI入門Linuxコマンド集Windowsコマンド集で覚えたコマンドを、実際の問い合わせに近い「案件(チケット)」形式で使う練習です。全14件を、やさしい順に並べています。前半は影響の小さい参照系(Lv.1)で、状態を見るだけでシステムを変えない操作です。後半は変更を伴う一次対応(Lv.3)で、原因の切り分けから応急の復旧までを最初に行う対応です。

依頼を受理現状を確認方針を判断最小限を実行結果を確認記録・報告
このパックの約束

すべて自分専用の仮想マシン、WSL(WindowsのなかでLinuxを動かす仕組み)、または学習用コンテナ(アプリを動かすための、使い捨てできる小さな実行環境)で試します。会社・学校・公開中サーバーでは、承認、バックアップ、影響範囲、戻し方を確認してから操作します。掲載する依頼文と実行結果は、すべて架空の学習例です。実機で一括実行した証跡(実際に操作した記録)ではありません。

案件06のグループ・案件11のタイマーについて

案件06のapp-readersグループや案件11のdaily-backup.timerは、依頼の状況を説明するための架空の設定名です。本パックは、コマンドの読み方と考え方を練習する演習です。同じ名前のグループやsystemdタイマー(Linuxが決まった時刻に処理を自動で実行する仕組み)を自分の環境に作って再現する手順は、扱いません。実際に手を動かして環境を再現しながら学びたい場合はLinux基本確認のLab(実際に手を動かす実習)で行います。

1. 案件対応の合言葉「受・見・決・動・確・残」

かんたんに言うとこの6文字は「仕事の進め方の順番」です。他のページに出てくる合言葉は「何を見るか」の一覧なので、役割が違います。混ざりやすいので、先にここで区別しておきます。

どの案件も、この6文字の順番で進めると迷いません。cui-manual.htmlの6点確認やlinux-lab.htmlの「重・空・動・記・通・入・壁」と役割が違う点に注意してください。あちらは「何を見るか」、こちらは「依頼をどう受けて、どう進めるか」という仕事の流れそのものです。

合言葉:受・見・決・動・確・残うけ・み・けつ・どう・かく・ざん

受理 → 現状を見る → 方針を決める → 実行する → 確かめる → 記録を残す、の順です。

  1. 受理(誰から・何を・優先度)

    依頼者、対象システム、いつまでか、緊急度を確認する。分からなければ聞き返す。

  2. 現状を見る(変更しない)

    参照系のコマンドだけで、今の状態・ログ・設定を確認する。

  3. 方針を決める

    見た事実から仮説を立て、影響範囲と戻し方を考え、必要なら承認を得る。

  4. 実行する

    決めた最小限の操作だけを行う。参照だけで済む案件は「操作なし」も正しい判断。

  5. 確かめる

    実行後に別コマンドで結果を確認する。表示されただけで成功と決めない。

  6. 記録を残す

    事実・推測・未確認を分けて、依頼者と関係者へ報告する。

2. 難易度の見方

各案件のラベルは、操作の影響範囲を基準にしています。cui-manual.htmllinux-commands.htmlriskバッジ(危険度を色で示す小さな目印)と同じ色分けです。

Lv.の数字は「操作を間違えたときの影響の大きさ」を表す基準であり、覚えることの多さや難しさの順ではありません。たとえば案件08のSSH鍵認証は、打つコマンド自体は短い案件です。しかし、鍵と公開鍵の関係や、なぜフィンガープリント(接続先サーバーの身元を表す短い文字列)を照合するのかという考え方の理解が先に必要です。このようにLv.2でも、理解に時間がかかる案件があります。

Lv.1参照のみ

見て終わる案件

状態やファイルを読むだけで、システムへの影響がありません。何度実行しても安全です。まず参照コマンドだけで案件01・03・07・10・12・13を練習します。

Lv.2作成・調査

準備や深掘りを伴う案件

バックアップ作成、権限や容量の詳しい調査、SSH鍵の準備など、対象を確認してから進める案件です。案件02・04・06・08・09・11が該当します。

Lv.3変更を伴う

設定反映・復旧を含む案件

サービスの再読込や再起動など、承認と6点確認を経てから行う案件です。案件05・14が該当します。cui-manual.htmlの「変更コマンドの前に6点確認」(対象・目的・影響・退避・戻し方・再確認の6項目)を先に読んでおきます。

3. ファイル・バックアップ案件

案件 No.01 | Lv1 参照のみ

設定ファイルの場所と中身を教えてほしい

依頼:「nginxの設定ファイルがどこにあるか、中身も含めて教えてほしいんだ。新しく入ったメンバーに説明したくて。」

対象はUbuntuサーバーです。nginx(Webページを配信するサーバーソフト)は、すでにapt(Ubuntuでソフトを導入・更新する道具)でインストール済みという想定です。

  1. (受)依頼者が誰で、共有する情報(ファイルパスや設定内容)に社外秘や個人情報が含まれないかをまず確認します。
  2. (見)which nginxで実行ファイルの場所を確認し、find /etc -maxdepth 2 -iname "nginx.conf"で設定ファイルの候補パスを確認します。
  3. (決)見つかったパスが標準的な配置(/etc/nginx/nginx.conf)であることを確認し、参照のみで依頼に応えられる作業だと判断します。
  4. (動)変更は行わないため、ls -l /etc/nginx/nginx.confで所有者・権限・更新日時を確認したうえで、less /etc/nginx/nginx.confで中身を1画面ずつ表示します。
  5. (確)less画面内で/を押してincludeなどのキーワードを検索し、主要なディレクティブ(設定項目)が読み取れることを確かめてからqで終了します。
  6. (残)依頼者へ設定ファイルの場所(/etc/nginx/nginx.conf)と確認できた主要な設定内容を事実として報告し、個別サイトの設定(sites-available配下など)はまだ未確認である旨を伝えます。
ヒント(使うコマンド名だけ)

使用する主なコマンド:whichfindlsless

模範解答を見る(コマンド全文・実行結果の例・解説)
$ which nginx
/usr/sbin/nginx
$ find /etc -maxdepth 2 -iname "nginx.conf"
/etc/nginx/nginx.conf
$ ls -l /etc/nginx/nginx.conf
-rw-r--r-- 1 root root 1257 Jun 12 09:41 /etc/nginx/nginx.conf
$ less /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
(END)

whichの結果は実行ファイルがシステムに存在することを示し、findの結果で設定ファイルの実パスが特定できます。ls -lの権限が-rw-r--r--で所有者がroot(システム全体を操作できる管理者ユーザー)であれば、一般ユーザーは読み取りのみ可能な標準的な状態だと判断できます。lessで開いた内容から、このファイルが個別サイトの設定をincludeで取り込む「入口」の役割であることが読み取れます。

案件 No.02 | Lv2 作成・複製

変更前にバックアップを取ってほしい

依頼:「app.confの設定を直したいから、先にバックアップを取っておいてもらえる? 万が一のときにすぐ戻せるようにしておきたいんだ。」

対象は/etc/nginx/sites-available/app.confで、依頼者はこの後この本体ファイルを編集する予定という想定です。

  1. (受)依頼者が誰で、対象ファイルが/etc/nginx/sites-available/app.confで間違いないか、バックアップ後にどんな変更を予定しているかを確認します。
  2. (見)pwdで現在の作業ディレクトリを確認し、ls -l /etc/nginx/sites-available/app.confでファイルの存在・所有者・権限・サイズを確認します。
  3. (決)対象ファイルが存在し自分に読み取り権限があることを確認したうえで、日付入りのファイル名で複製すれば元の状態へ安全に戻せると判断します。
  4. (動)/etc/nginx/sites-availableディレクトリは所有者がrootです。そのため、管理者の権限で1回だけコマンドを実行するsudoを付けて、sudo cp -i app.conf app.conf.bak.$(date +%Y%m%d)を実行します。$(date +%Y%m%d)の部分は実行した日の日付(例:20260829)に置き換わるので、日付つきのバックアップファイルができます。
  5. (確)diff -u app.conf app.conf.bak.20260829で複製元と複製先に差分がないことを確認し、stat -c '%A %a %n' app.conf.bak.20260829で権限が正しく引き継がれているかも確認します。
  6. (残)依頼者へバックアップファイル名(app.conf.bak.20260829)と保存場所、差分なしを確認できた事実を報告し、app.conf本体の編集作業にはまだ着手していないことを明記します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:pwdlscpdiffstat

模範解答を見る(コマンド全文・実行結果の例・解説)
$ pwd
/etc/nginx/sites-available
$ ls -l app.conf
-rw-r--r-- 1 root root 842 Aug 20 09:15 app.conf
$ sudo cp -i app.conf app.conf.bak.20260829
$ diff -u app.conf app.conf.bak.20260829
$ stat -c '%A %a %n' app.conf.bak.20260829
-rw-r--r-- 644 app.conf.bak.20260829

ls -lの結果から、対象ファイルが存在し所有者がrootであることを事前に確認できます。/etc/nginx/sites-availableディレクトリへの書き込みには管理者権限が必要なためsudoを付けて実行し、-iオプションにより複製先が既に存在する場合だけ上書き確認が入ります(今回は初回実行のため確認なしでそのまま複製されます)。diff -uは差分がなければ何も出力しないため、出力が空であることが「複製が正しく完成した」証拠になります。最後のstatで権限が複製元と同じ644であることを確認し、バックアップとして問題なく保存できたと判断します。

安全メモ:依頼者に対象ファイルのフルパスを復唱して認識合わせを行い、sudoを使う操作である点を意識したうえでcp -iの上書き確認を必ず有効にしたまま実行します。元に戻す必要が生じた場合はsudo cp app.conf.bak.20260829 app.confで復元できることをあらかじめ確認しておきます。

4. プロセス・サービス運用案件

案件 No.03 | Lv1 参照のみ

サーバーの反応が遅いと言われた

依頼:「さっきからサーバーの反応が遅いんだけど、なにか起きてないか見てもらえる?」

対象は複数人が同時に使う検証用サーバーです。原因を決めつけず、まず状態を確認する一次切り分け(原因がどのあたりにあるかを最初に絞り込む作業)を行います。

  1. (受)依頼者から、いつ頃から遅いと感じているか、特定の操作だけが遅いのか全体的に遅いのかを確認します。
  2. (見)uptimeコマンドでロードアベレージ(直近1分・5分・15分間の平均的な負荷を表す数値)と稼働時間を確認し、CPUコア数に対して負荷が高すぎないかを見ます。
  3. (決)ロードアベレージやメモリ使用率が高ければリソース逼迫が原因という仮説を立て、原因プロセスを特定できるまでは変更を行わないと判断します。
  4. (動)変更は行いません。free -hでメモリとスワップ(メモリが不足したときに一時的にディスクを使う仕組み)の使用状況を、ps -eo pid,user,pcpu,pmem,etime,comm --sort=-pcpu | headでCPU使用率上位のプロセスを確認します(|はパイプと呼ばれる記号で、前のコマンドの結果を次のコマンドへ渡します。headは先頭の10行だけを表示します。-eoは表示する列を自分で指定するオプション、--sort=-pcpuはCPU使用率(pcpu列)の降順に並べ替えるオプションです。詳しくはLinuxコマンド集のOS・負荷・プロセスを参照してください)。
  5. (確)psの出力にある経過時間(ELAPSED)とプロセス名から、直近に始まった処理が負荷の原因になっていないかを照らし合わせます。
  6. (残)ロードアベレージ・メモリ使用率・上位プロセスという確認できた事実と、原因についてはまだ推測の段階であることを分けて上長に報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:uptimefreeps

模範解答を見る(コマンド全文・実行結果の例・解説)
$ uptime
 14:32:05 up 12 days,  3:41,  2 users,  load average: 3.85, 3.10, 2.40

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.8Gi       5.6Gi       312Mi       102Mi       1.9Gi       1.7Gi
Swap:          2.0Gi       1.2Gi       808Mi

$ ps -eo pid,user,pcpu,pmem,etime,comm --sort=-pcpu | head
    PID USER      %CPU %MEM     ELAPSED COMMAND
   2318 appuser   92.0  8.1       00:47 java
   2110 appuser   15.3  3.2    01:15:02 java
    980 root       2.1  0.4    12-03:41:58 sshd
    511 root       0.8  0.3    12-03:41:55 nginx
      1 root       0.1  0.2    12-03:41:59 systemd

この例では、ロードアベレージが同時利用者数やCPUコア数に対してかなり高い水準になっており、負荷が高い状態と読み取れます。さらにpsの出力を見ると、PID(プロセスに付けられた識別番号)2318のjavaプロセスがCPUを92%使用しています。ELAPSED(起動してからの経過時間)は00:47で、直近に始まったばかりです。この2点から、このプロセスが今回の遅さに関係している可能性が高いと判断できます。free -hの出力ではスワップ(Swap)の使用量が1.2Giとあり、メモリ不足によるスワップも遅延の一因と考えられます。ただしこの時点では原因を断定せず、プロセスの詳細調査や担当者への確認が次の対応になります。

案件 No.04 | Lv2 調査

Webサイトが繋がらないと言われた

依頼:「社内向けのWebサイトにアクセスできないんだけど、確認してもらえますか?」

対象はnginxで動作している社内向けWebサーバーで、まだ再起動などの変更は行わず、状況の切り分けを行います。

  1. (受)依頼者から、いつからアクセスできないか、アクセス先のURL、エラー画面の内容、影響を受けている人数や範囲を確認します。
  2. (見)systemctl status nginxで、nginxサービス(サーバーの裏側でずっと動き続けるプログラム)が稼働中(active (running))かどうかを確認します。この段階では状態を変えません。
  3. (決)サービスが停止していればプロセス側の問題、稼働中であれば待受ポートやアプリ側の問題という仮説を立て、次の確認で判断材料を集めます。
  4. (動)変更は行いません。systemctl --failedで他に失敗しているサービスがないか、journalctl -u nginx -n 50 --since "30 min ago"で直近のログにエラーがないか、ss -tulnpでnginxがどのアドレス・ポートで待ち受けているかを確認します(-tulnpt=TCP、u=UDP、l=待受(listen)状態、n=名前解決せず数値表示、p=プロセス情報も表示、をまとめて指定するオプションの組み合わせです。詳しくはLinuxコマンド集のネットワークを参照してください)。
  5. (確)ss -tulnpの出力にあるLocal Addressが外部から到達できる待受になっているかを、journalctlのログと合わせて矛盾がないか確認します。
  6. (残)事実と推測を分けて上長へ報告します。事実は「nginxは稼働中でエラーログもないが、80番ポートがループバックアドレス(自分自身だけを指すアドレス。127.0.0.1)でしか待ち受けていない」ことです。推測は「これが社内から繋がらない原因ではないか」という点です。そのうえで、設定変更の要否を確認します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:systemctljournalctlss

模範解答を見る(コマンド全文・実行結果の例・解説)
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2026-08-29 09:12:03 JST; 5h 20min ago
   Main PID: 1188 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 5.2M
        CPU: 812ms
     CGroup: /system.slice/nginx.service
             ├─1188 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─1189 nginx: worker process

$ systemctl --failed
  UNIT LOAD ACTIVE SUB DESCRIPTION
0 loaded units listed.

$ journalctl -u nginx -n 50 --since "30 min ago"
-- No entries --

$ ss -tulnp
Netid  State   Recv-Q Send-Q   Local Address:Port    Peer Address:Port  Process
tcp    LISTEN  0      511         127.0.0.1:80             0.0.0.0:*      users:(("nginx",pid=1188,fd=6))
tcp    LISTEN  0      128           0.0.0.0:22              0.0.0.0:*      users:(("sshd",pid=812,fd=3))

systemctl statusではActive: active (running)と表示されており、サービス自体は起動していることが読み取れます。systemctl --failedでも失敗しているユニットはなく、journalctlの直近30分のログにもエラーは出ていません。一方でss -tulnpの出力を見ると、nginxは127.0.0.1:80、つまりサーバー自身からしかアクセスできないループバックアドレスでしか待ち受けていないことがわかります。サービスは正常でも社内の他の端末からは接続できない状態であり、listenディレクティブ(nginxがどのIPアドレス・ポートで待ち受けるかを指定する設定項目)などの設定を確認してもらう必要がある、という推測につながります。

安全メモ:この案件ではsystemctl status/--failed、journalctl、ssといった参照系コマンドのみを使用し、サービスの停止・再起動・設定変更は行っていません。ログにはアクセス元IPなどの情報が含まれることがあるため、報告や共有の際は取り扱いに注意します。

案件 No.05 | Lv3 変更を伴う

設定ファイルを直したので反映してほしい

依頼:「nginxの設定ファイルを直し終わったので、反映しておいてもらえますか?」

対象は稼働中のnginxです。利用者への影響を避けるため、停止(stop)ではなく、サービスを止めずに設定だけを読み直す無停止のreloadで反映します。

  1. (受)依頼者から、編集したファイルの場所、編集内容の概要、反映の期限や利用者への影響有無を確認します。
  2. (見)sudo nginx -tで設定ファイルの構文チェックを行い、まだ反映せずに現在の設定に誤りがないかを確認します。
  3. (決)構文チェックの結果が正常(syntax is ok / test is successful)であれば反映してよいと判断し、エラーが出ていれば反映せず担当者に差し戻します。
  4. (動)構文チェックに問題がなければsudo systemctl reload nginxを実行し、サービスを停止せずに設定を反映します。
  5. (確)systemctl status nginxを実行し、reload後もactive (running)のままで、プロセスが異常終了していないことを確認します。次にcurl -I --max-time 5 http://localhostで、Webサーバーからの応答(HTTPレスポンス)が正常に返ってくるかを確認します。curlは、コマンドからWebサーバーへ接続して応答を確かめる道具です。
  6. (残)構文チェックの結果、reloadを実行した時刻、reload後のサービス状態とcurlの応答コードという確認できた事実を担当者へ報告し、利用者への影響がなかったことを共有します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:nginx -tsystemctl reloadsystemctl statuscurl

模範解答を見る(コマンド全文・実行結果の例・解説)
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl reload nginx

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2026-08-29 09:12:03 JST; 5h 41min ago
   Main PID: 1188 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 5.4M
        CPU: 823ms
     CGroup: /system.slice/nginx.service
             ├─1188 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─2450 nginx: worker process

$ curl -I --max-time 5 http://localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 29 Aug 2026 05:53:10 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive

sudo nginx -tでsyntax is ok / test is successfulと表示されていれば、設定ファイルに文法上の誤りがないことが確認できます。reload実行後もsystemctl statusのMain PIDが1188のまま、Activeの起動時刻も変わっていないことから、プロセスが再起動されずに無停止で設定が反映されたと読み取れます。最後にcurl -I --max-time 5 http://localhostでHTTP/1.1 200 OKが返っていれば、Webサーバーが正常に応答していることの確認になります。

安全メモ:反映前に必ずsudo nginx -tで構文チェックを行い、エラーが出た場合は絶対にreloadを実行せず担当者に差し戻します。stopではなくreloadを使うことで既存の接続を維持したまま反映でき、影響を最小限にできます。念のため編集前の設定ファイルのバックアップの有無や、異常時に元の設定へ戻す手順を担当者と確認しておくと安全です。

もし構文チェックでエラーが出ていたら:設定ファイルの記述を誤ると、たとえば次のようなエラーが表示されることがあります(架空の例です)。

$ sudo nginx -t
nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/app.conf:12
nginx: configuration file /etc/nginx/nginx.conf test failed

この場合はまだ何も反映されていません。エラー行(この例では12行目)と内容を担当者に伝えて設定ファイルを差し戻すか、依頼者の許可を得て自分でその1行だけを修正し、再度sudo nginx -tでsyntax is ok / test is successfulに変わることを確認してからreloadに進みます。testが失敗したままreloadを実行してはいけません。

5. 権限・ネットワーク案件

かんたんに言うとここでは「ファイルが開けない」と「相手につながらない」の2つを扱います。前者はファイルの持ち主と読み書きの許可を確かめ、後者は名前解決・経路・ポートのどこで止まっているかを順番に確かめます。

案件 No.06 | Lv2 調査・変更

権限エラーでファイルを開けないと言われた

依頼:「/var/log/app/access.log を開こうとすると『Permission denied(権限がない、という意味のエラー)』って出るんです。見れるようにしてもらえますか?」

対象は本番Webアプリのログファイル /var/log/app/access.log です。所有者やグループの設定に不備がある可能性を疑いつつ確認します。

  1. (受)依頼者から、いつからこの状態か、どのユーザー・どの権限で操作しているか、緊急度はどの程度かを確認します。
  2. (見)まず whoami と id を実行し、依頼者(自分)が誰で、どのグループに所属しているかを確認します。次に ls -l /var/log/app/access.log と stat -c '%A %a %n' /var/log/app/access.log で現在の所有者・グループ・パーミッションを確認します。
  3. (決)id で確認したグループがファイルの所有グループと一致していない、またはグループへの読み取り権限自体が付与されていないことが原因だと仮説を立て、変更対象がこの1ファイルに限定できることを作業許可の基準とします。
  4. (動)sudo chown app:app-readers /var/log/app/access.log で、ファイルの所有グループを app-readers に変更します。次に sudo chmod 640 /var/log/app/access.log を実行し、「所有者は読み書き、グループは読み取りのみ、その他は不可」に権限を設定し直します(数字の意味やchownchmodの使い分けはLinuxコマンド集のユーザーと権限にまとめています)。
  5. (確)再度 ls -l /var/log/app/access.log を実行し、所有グループと権限が意図した設定に変わっているかを確認します。
  6. (残)依頼者へ「グループ所有者と権限の不備が原因と判断し、chown/chmodで修正済み」という事実と、「他の同種ログファイルにも同じ問題がないかは未確認」という点を分けて報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:whoamiidlsstatchownchmod

模範解答を見る(コマンド全文・実行結果の例・解説)
$ whoami
student01
$ id
uid=1001(student01) gid=1001(student01) groups=1001(student01),1002(app-readers)
$ ls -l /var/log/app/access.log
-rw------- 1 app app 3145728  8月 29 09:12 /var/log/app/access.log
$ stat -c '%A %a %n' /var/log/app/access.log
-rw------- 600 /var/log/app/access.log
$ sudo chown app:app-readers /var/log/app/access.log
$ sudo chmod 640 /var/log/app/access.log
$ ls -l /var/log/app/access.log
-rw-r----- 1 app app-readers 3145728  8月 29 09:12 /var/log/app/access.log

stat の結果から、ファイルの権限が600(所有者のみ読み書き可)になっていることがわかります。つまり、id で確認した app-readers グループに自分が所属していても、そもそもグループには読み取り権限が付与されていなかったのです。chown で所有グループを app-readers に変更し、chmod 640 で「所有者は読み書き、グループは読み取りのみ」に権限を広げたことで、グループメンバーからも参照できる状態にしました。最後の ls -l で所有グループが app-readers、権限が rw-r----- になっていれば、修正が意図通り反映されたと判断できます。

安全メモ:sudo で所有者・権限を変更する前に、対象パスが依頼のあった1ファイルだけであることを ls -l で再確認し、他の設定ファイルやログまで巻き込まないようにします。変更前の stat の出力を控えておくと、想定と違う結果になったときに元の状態へ戻す手がかりになります。

案件 No.07 | Lv1 参照のみ

取引先システムに繋がらないと言われた

依頼:「取引先の partner.example.com に繋がらないってお客様から連絡があって……原因の見当だけでも先に教えてもらえますか?」

DNS(名前解決の仕組み)、経路(ネットワークの通り道)、ポート(通信の出入り口)のどこに問題があるかを切り分けます。今回は状況確認のみを行い、設定変更は行いません。

  1. (受)依頼者から、いつから繋がらないか、社内の他の人も同じ症状か、対象は特定のURLかサービス全体かを確認します。
  2. (見)getent hosts partner.example.com で名前解決(ドメイン名からIPアドレスを調べること)ができているかを確認します。
  3. (決)名前解決ができていれば、次に経路とポートへの到達性を順に確認し、どの段階で失敗しているかを「怪しい箇所」の仮説とします。
  4. (動)ip route でデフォルトゲートウェイ(自分のネットワークの外に出る際に経由する機器)への経路情報を確認します。次に curl -I --max-time 5 https://partner.example.com を実行し、HTTPS(暗号化されたWeb通信)の応答が返るかを確認します。変更は行いません。
  5. (確)名前解決の成否・経路情報・HTTPSレスポンスの有無を突き合わせ、どの段階まで正常に到達できているかを整理します。
  6. (残)上長へ「DNSと社内の経路までは到達を確認済み、その先のHTTPS応答がタイムアウトしている」という事実と、「取引先側のファイアウォールや相手サーバーの状態は未確認」という推測・未確認事項を分けて報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:getentipcurl

模範解答を見る(コマンド全文・実行結果の例・解説)
$ getent hosts partner.example.com
198.51.100.45   partner.example.com
$ ip route
default via 203.0.113.1 dev eth0 proto dhcp metric 100
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.10
$ curl -I --max-time 5 https://partner.example.com
curl: (28) Connection timed out after 5001 milliseconds

getent hosts の結果からIPアドレスへの名前解決はできており、DNSの問題ではないと判断できます。ip route でデフォルトゲートウェイへの経路が設定されていることも確認できたため、社内ネットワークの出口までは問題なさそうです。一方で curl -I の結果はタイムアウトしており、名前解決と経路は正常でも、宛先ポート(443番)まで到達できていないことがわかります。取引先側のファイアウォールや相手サーバーの状態まではこの手順だけでは確認できないため、断定は避け「DNSと経路は正常、ポート到達に問題がある可能性が高い」という段階までを報告します。

案件 No.08 | Lv2 準備・接続

別サーバーへSSHで安全に入りたい

依頼:「新しく担当してもらうサーバー(192.0.2.20)があるので、パスワードじゃなくて鍵認証でSSH接続できるように準備してもらえますか?」

SSH(ネットワーク越しに別のサーバーへ安全にログインする仕組み)の鍵認証(秘密鍵と公開鍵のペアを使ったログイン方式)を使うことで、パスワード漏えいのリスクを減らせます。今回は学習用の鍵ペアを新規作成し、接続確認を行う想定です。

  1. (受)依頼者から、接続先サーバー名・IPアドレス、接続用ユーザー名、公開鍵をどこに登録すればよいか(自分で登録するのか、サーバー管理者に渡すのか)を確認します。
  2. (見)ls -la ~/.ssh で ~/.ssh ディレクトリと既存ファイルの権限・一覧を確認し、既存の鍵ペアを誤って上書きしてしまわないかを確認します。
  3. (決)既存の鍵と名前・用途が重ならないことを確認できたら、新しい鍵ペア(ed25519方式の鍵)を専用のファイル名で作成してよいと判断します。
  4. (動)ssh-keygen -t ed25519 -C "student@example.com" -f ~/.ssh/lab_key で新しい鍵ペアを作成します(-t は鍵の方式、-C はコメント、-f は保存するファイル名を指定するオプションです)。公開鍵の登録は、自分で ssh-copy-id -i ~/.ssh/lab_key.pub student@192.0.2.20 を実行して転送する方法と、公開鍵ファイルをサーバー管理者へ渡して登録してもらう方法があります(今回は学習環境のため、事前に管理者が公開鍵を登録済みという想定で進めます)。そのうえで ssh -i ~/.ssh/lab_key student@192.0.2.20 で接続を試みます。
  5. (確)鍵作成後に ls -la ~/.ssh を再度実行し、ディレクトリの権限が700、鍵ファイルの権限が600になっているかを確認します。秘密鍵を自分以外が読めない状態にしておくためです。そのうえで、接続時に表示されるホスト鍵のフィンガープリント(接続先サーバーの身元を表す値)が、事前に共有された値と一致するかを確認します。ここまで確認できれば「接続先が本物のサーバーだと確かめたうえで、鍵認証で入れた」と説明できます。
  6. (残)依頼者へ「鍵認証でのSSH接続ができることを確認済み」という事実と、「ホスト鍵の正当性はフィンガープリント一致で確認したが、サーバー管理者への正式な鍵登録経路の確認は別途必要」という点を分けて報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:lsssh-keygenssh-copy-idssh

模範解答を見る(コマンド全文・実行結果の例・解説)
$ ls -la ~/.ssh
drwx------  2 student01 student01 4096  8月 20 10:00 .
drwx------ 15 student01 student01 4096  8月 20 09:55 ..
-rw-------  1 student01 student01  411  8月 20 10:00 id_ed25519
-rw-r--r--  1 student01 student01   98  8月 20 10:00 id_ed25519.pub
$ ssh-keygen -t ed25519 -C "student@example.com" -f ~/.ssh/lab_key
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/student01/.ssh/lab_key
Your public key has been saved in /home/student01/.ssh/lab_key.pub
$ ls -la ~/.ssh
drwx------  2 student01 student01 4096  8月 29 10:05 .
drwx------ 15 student01 student01 4096  8月 20 09:55 ..
-rw-------  1 student01 student01  411  8月 20 10:00 id_ed25519
-rw-r--r--  1 student01 student01   98  8月 20 10:00 id_ed25519.pub
-rw-------  1 student01 student01  411  8月 29 10:05 lab_key
-rw-r--r--  1 student01 student01   98  8月 29 10:05 lab_key.pub
$ ssh -i ~/.ssh/lab_key student@192.0.2.20
The authenticity of host '192.0.2.20 (192.0.2.20)' can't be established.
ED25519 key fingerprint is SHA256:ab12CD34ef56GH78ij90KL12mn34OP56qr78ST90uv.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.0.2.20' (ED25519) to the list of known hosts.
Last login: Fri Aug 28 22:10:03 2026 from 203.0.113.10
student@labsrv2:~$

ls -la ~/.ssh の結果から、ディレクトリ自体が700(所有者のみアクセス可)、新しく作った秘密鍵 lab_key が600(所有者のみ読み書き可)、公開鍵 lab_key.pub が644になっており、鍵認証で推奨される権限になっていることを確認できます。ssh 接続時に表示されたホスト鍵のフィンガープリントは、接続先サーバーの管理者から事前に共有された値と別経路で照合したうえで yes と応答します。プロンプトが student@labsrv2 に変わっていれば、鍵認証でのSSH接続に成功したと判断できます。

安全メモ:初めて接続するホストのフィンガープリントは、SSH接続そのものとは異なる手段(電話や社内の別ドキュメントなど)で確認済みの値と照合してから yes と答えます。秘密鍵ファイルの権限が 600 以外になっていないか、誤って他人に共有・アップロードしていないかを都度確認します。

6. ディスク・パッケージ・定期実行案件

案件 No.09 | Lv2 調査

ディスクが一杯だと警告が出た

依頼:「監視システムからディスク使用率の警告メールが来ているんだけど、原因になっているファイルを調べてもらえる?まだ何も消さないでね」

対象は本番Webサーバーで、/var配下にログが溜まりやすい構成です。

  1. (受)どの監視から、いつ、どのしきい値で警告が出たのか、対象サーバー名とあわせて依頼者に確認します。
  2. (見)df -hTでどのパーティション(ディスクの区画)の空きが少なくなっているかを確認します。続けてdu -sh /var/log/* | sort -rh | headを実行し、容量の大きいディレクトリやファイルを特定します(sort -rhdu -shが出す「1.1G」のような単位付き数値を、単位を考慮したまま大きい順(-rは逆順、-hは単位付き数値として比較)に並べ替えます。dudfの使い分けはLinuxコマンド集を参照してください)。
  3. (決)古いログファイルが原因という仮説を立て、削除や圧縮は依頼者・上長の承認を得てから実施するという判断基準を確認します。
  4. (動)今回は調査のみのため、find /var/log -type f -name "*.gz" -mtime +30で30日以上前の圧縮済みログを一覧表示するにとどめ、削除などの変更は行いません(-mtime +30は「更新日時が30日より前」を指定するオプションです。findの条件の読み方はLinuxコマンド集のファイルを読む・探すを参照してください)。
  5. (確)再度df -hTを実行し、対象パーティションの使用率が変化していないこと(調査だけで状態を変えていないこと)を確認します。
  6. (残)事実として使用率の数値と容量上位のディレクトリ、推測として古いログが主因である可能性、未確認として削除の承認有無を分けて依頼者に報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:dfdufind

模範解答を見る(コマンド全文・実行結果の例・解説)
$ df -hT
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sda1      ext4   50G   47G  1.2G  98% /
$ du -sh /var/log/* | sort -rh | head
3.2G    /var/log/app
1.1G    /var/log/nginx
210M    /var/log/journal
$ find /var/log -type f -name "*.gz" -mtime +30
/var/log/app/access.log.12.gz
/var/log/app/access.log.13.gz
/var/log/app/error.log.9.gz

df -hTの「Use%」列が90%を超えている行が、逼迫しているパーティションです。du -shの結果を容量の大きい順(sort -rh)に並べることで、原因になっているディレクトリの見当がつきます。今回の例では/var/log/appが最も大きく、findで30日以上前の圧縮ログが複数見つかったことから、古いログの蓄積が使用率上昇の主因と推測できます。あくまで一覧表示までの調査であり、この時点ではファイルは1つも削除していません。

安全メモ:ログの削除や圧縮は、対象ファイルを依頼者と一緒に再確認し、必要であれば別のディスクへコピー(バックアップ)を取ってから、承認を得た範囲でのみ実施します。

案件 No.10 | Lv1 参照のみ

導入済みソフトのバージョンを教えてほしい

依頼:「このサーバーに入っているnginxのバージョン、今いくつだったか教えてくれる?」

Linuxには、Ubuntu系とRHEL系(Red Hat Enterprise Linux系。企業でよく使われる系統)があります。ソフトを導入・管理する道具が系統ごとに違い、Ubuntu系(dpkg/apt)とRHEL系(dnf/rpm)でコマンドが異なるため、OSの種類にあわせて確認します。

  1. (受)対象サーバーのOSの種類(Ubuntu系かRHEL系か)と、バージョンを確認したい目的(脆弱性対応か棚卸しかなど)を確認します。脆弱性とはソフトの弱点のことで、放置すると攻撃に使われます。棚卸しは、導入済みソフトの一覧を作って管理することです。
  2. (見)Ubuntu系ではdpkg -l | grep nginxapt list --installed 2>/dev/null | grep nginx、RHEL系ではdnf list installed nginxrpm -q nginxで導入済みパッケージのバージョンを確認し、あわせてnginx -vで実行ファイル自体のバージョンも確認します(dpkg -l-lは導入済みパッケージの一覧表示、rpm -q-qはパッケージ情報を問い合わせるオプションです。Ubuntu系とRHEL系の対応表はLinuxコマンド集のソフトウェアの管理にまとめています)。
  3. (決)この案件は参照のみで判断が不要なため、確認できた値をそのまま報告する方針とします。
  4. (動)参照のみの案件のため、変更は行いません。
  5. (確)パッケージ管理コマンドの結果とnginx -vの結果が一致しているかを見比べ、表記の食い違いがないかを確認します。
  6. (残)事実として確認できたバージョン番号とOSの種類を依頼者に報告し、パッケージ未導入の場合はソースからの導入など未確認の可能性がある旨も添えます。
ヒント(使うコマンド名だけ)

使用する主なコマンド:dpkg または rpmnginx -v

模範解答を見る(コマンド全文・実行結果の例・解説)
【Ubuntu系の場合】
$ dpkg -l | grep nginx
ii  nginx  1.18.0-6ubuntu14.4  amd64  small, powerful, scalable web/proxy server

$ apt list --installed 2>/dev/null | grep nginx
nginx/jammy-updates,now 1.18.0-6ubuntu14.4 amd64 [installed]

$ nginx -v
nginx version: nginx/1.18.0

【RHEL系の場合】
$ dnf list installed nginx
Installed Packages
nginx.x86_64    1:1.20.1-14.el9    @appstream

$ rpm -q nginx
nginx-1.20.1-14.el9.x86_64

$ nginx -v
nginx version: nginx/1.20.1

Ubuntu系ではdpkg -lapt list --installedの出力の2列目・3列目あたりにバージョン番号が表示されます。RHEL系ではdnf list installedrpm -qの出力にパッケージ名とバージョンがまとめて表示されます。nginx -vはOSの種類によらず共通で使え、実際に動いているnginx本体のバージョンを直接確認できるため、パッケージ管理側の情報と突き合わせる際の確認用として役立ちます。

案件 No.11 | Lv2 調査

毎日決まった時刻のバックアップ設定を確認してほしい

依頼:「毎日深夜にバックアップが動いているはずなんだけど、本当にちゃんと動いているか確認してもらえる?」

バックアップの仕組みは、cron(定期実行の設定)で組まれている場合があります。もう一つ、systemd(Linuxがサービスの起動や停止をまとめて管理する仕組み)のtimer(同様に定期実行を担う仕組み)で組まれている場合もあります。どちらか分からないため、両方を確認します。

  1. (受)バックアップの実行主体(誰が設定したか)や想定実行時刻、対象データの範囲を依頼者に確認します。
  2. (見)crontab -lで対象ユーザーのcron設定を確認し、あわせてsystemctl list-timers --allでsystemdのtimer一覧を確認して、バックアップに関連するタイマーが登録されているかを確認します(--allを付けないと、次回実行予定のないタイマーが一覧から省かれることがあります。systemctlの基本はLinuxコマンド集のサービスとログを参照してください)。
  3. (決)タイマーやcronの設定が見つかった場合、直近の実行が成功しているかどうかまで確認して初めて「動いている」と判断できるという基準を確認します。
  4. (動)該当するタイマーが見つかった場合はsystemctl status daily-backup.timerで状態を確認し、実行ログはjournalctl -u daily-backup.service -n 20で直近20件を表示します。設定変更は行いません。
  5. (確)表示されたログの最新の実行時刻と結果(成功・失敗)を確認し、想定していた実行時刻とずれがないかを確認します。
  6. (残)事実として次回実行予定時刻と直近の実行結果、推測として問題があればその原因候補、未確認として確認できなかった項目を分けて依頼者に報告します。
ヒント(使うコマンド名だけ)

使用する主なコマンド:crontabsystemctljournalctl

模範解答を見る(コマンド全文・実行結果の例・解説)
$ crontab -l
no crontab for appuser

$ systemctl list-timers --all
NEXT                        LEFT     LAST                         PASSED  UNIT                 ACTIVATES
Sun 2026-08-30 03:00:00 UTC 6h left  Sat 2026-08-29 03:00:01 UTC  17h ago daily-backup.timer   daily-backup.service

$ systemctl status daily-backup.timer
● daily-backup.timer - Run daily-backup.service daily
     Loaded: loaded (/etc/systemd/system/daily-backup.timer; enabled)
     Active: active (waiting) since Mon 2026-08-24 09:00:00 UTC
    Trigger: Sun 2026-08-30 03:00:00 UTC; 6h left

$ journalctl -u daily-backup.service -n 20
Aug 29 03:00:01 web01 systemd[1]: Started daily-backup.service.
Aug 29 03:00:45 web01 backup.sh[2201]: backup completed: /backup/2026-08-29.tar.gz
Aug 29 03:00:45 web01 systemd[1]: daily-backup.service: Deactivated successfully.

今回の例ではcrontab -lには該当ユーザーの設定がなく、代わりにsystemctl list-timers --alldaily-backup.timerが見つかりました。「LAST」列が直近の実行時刻、「NEXT」列が次回実行予定時刻を示しており、想定どおり深夜3時台に動いていることが読み取れます。さらにjournalctl -u daily-backup.service -n 20で「backup completed」というログが確認できたため、バックアップ自体も正常に完了していると判断できます。もしcronとtimerのどちらにも設定が見つからない場合は、バックアップの仕組み自体を依頼者に確認し直す必要があります。

安全メモ:確認作業では設定ファイルの内容を書き換えず、状態確認のコマンドのみを使用します。もし設定に問題が見つかった場合の修正は、変更内容を依頼者・上長と共有し、承認を得てから実施します。

7. Windows対比案件

かんたんに言うとやることはLinuxの案件とほとんど同じで、使う道具の名前だけが変わります。LinuxのpsがWindowsではGet-Processにあたる、というように読み替えます。

同じ調査を、Windows端末でも行う練習です。詳しい対応表はWindowsコマンド集の合言葉「端・場・通・動・記・権」も参照してください。

PowerShellのコマンドは|(パイプ)でつなぐと、前のコマンドが返した結果(オブジェクト。項目名と値がひとまとまりになったデータ)を、そのまま次のコマンドに渡せます。たとえば案件12のGet-Process | Sort-Object CPU -Descending | Select-Object -First 10は、「プロセス一覧を取得し(Get-Process)→ CPU使用時間の降順に並べ替え(Sort-Object CPU -Descending)→ 上位10件だけを取り出す(Select-Object -First 10)」という意味です。案件13のTest-NetConnectionも、画面に表示される項目そのものがオブジェクトの中身なので、必要なら同じようにSelect-Objectで特定の項目だけを取り出せます。

案件 No.12 | Lv1 参照のみ

同じ調査をWindows端末でもしてほしい

依頼:「さっきLinuxのWebサーバーで見てもらった『反応が遅い』って相談、実はWindows ServerのAP01でも同じ声が上がってるんだ。同じやり方で一次確認だけお願いできる?」

対象はWindows Server上のAPサーバー(アプリケーションサーバー。業務用のアプリを動かす役割のサーバー)AP01です。PowerShellで一次確認だけを行い、設定変更は行いません。

  1. (受)依頼者から、いつからどの程度遅いと感じているか、対象サーバー名(AP01)、緊急度、報告期限を確認します。
  2. (見)hostnamewhoamiで対象サーバーと実行アカウントを確認したうえで、systeminfoで起動時刻と空きメモリを、Get-Process | Sort-Object CPU -Descending | Select-Object -First 10でCPU使用時間の多いプロセスを確認します。
  3. (決)CPU使用時間の多いプロセスと空きメモリの状況から、「特定のプロセスの負荷が原因ではないか」という仮説を立てます。そのうえで、Get-Serviceで想定サービスが停止していないことまで確認できた場合に、この情報で依頼者へ一次報告してよいと判断します。
  4. (動)今回は状況把握のための確認のみを行い、プロセスの終了やサービスの再起動などの変更は行いません。
  5. (確)Get-Service | Where-Object Status -eq "Running"で必要なサービスが停止していないかを確認し、少し時間を置いて同じコマンドを再実行して傾向が変わっていないかを確かめます。
  6. (残)依頼者には、確認した時刻とコマンドの結果(CPU使用時間の多いプロセス、稼働中サービス)を事実として伝え、原因については「w3wpプロセスのCPU使用時間が高く、Webアプリケーション側の処理が影響している可能性がある」といった推測であることを明記し、アプリケーションログの詳細は未確認である旨を伝えます。
ヒント(使うコマンド名だけ)

使用する主なコマンド:hostnamewhoamisysteminfoGet-ProcessGet-Service

模範解答を見る(コマンド全文・実行結果の例・解説)
PS> hostname
AP01
PS> whoami
CORP\y.tanaka
PS> systeminfo

Host Name:                  AP01
OS Name:                     Microsoft Windows Server 2019 Standard
System Boot Time:            2026/08/25, 6:02:15
Total Physical Memory:       16,384 MB
Available Physical Memory:   1,120 MB

PS> Get-Process | Sort-Object CPU -Descending | Select-Object -First 10

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  ProcessName
-------  ------    -----      -----     ------     --  -----------
    842      45   210344     215600   1523.45    4032  w3wp
    312      22    45210      52800    312.11    1244  sqlservr
    198      15    18320      21400     98.02     880  MsMpEng

PS> Get-Service | Where-Object Status -eq "Running"

Status   Name               DisplayName
------   ----               -----------
Running  W3SVC              World Wide Web Publishing Service
Running  MSSQLSERVER        SQL Server (MSSQLSERVER)
Running  WinRM              Windows Remote Management

systeminfoの起動時刻から長期間再起動されていないこと、空きメモリが少なめであることがわかります。Get-Processの結果では、w3wpのCPU使用時間が突出しています。w3wpは、IIS(Windowsに標準で付いているWebサーバー機能)がWebアプリを動かすためのプロセス(アプリケーションプール)です。ここから、Webアプリケーション側の処理に時間がかかっている可能性が読み取れます。Get-Serviceで想定されるサービスがすべてRunningであれば、少なくともサービス停止による障害ではないと判断できます。これらはあくまで一次切り分けの材料であり、断定するにはアプリケーションログなど追加の確認が必要です。

案件 No.13 | Lv1 参照のみ

Windows端末から社内Webサーバーへの疎通を確認してほしい

依頼:「新しく用意したWindows端末から社内のWebサーバーserver01に接続できるか、設定を変えずに確認しておいてもらえますか?」

対象は社内ネットワーク上のWebサーバーserver01(HTTPS運用)で、確認端末はWindows 10/11相当を想定します。

  1. (受)依頼者から、対象端末の設置場所(拠点・セグメント)、確認対象がserver01のどのポート(HTTPS/443)か、確認期限を確認します。
  2. (見)Resolve-DnsName server01で名前解決ができるかを確認し、Get-NetIPConfigurationで確認端末自体のIPアドレス・デフォルトゲートウェイ・DNSサーバーの設定を確認します。
  3. (決)名前解決が成功していればネットワーク経路に大きな問題はないという仮説を立て、端末側のIPアドレスやDNSサーバーの設定にも明らかな誤りがなければ、実際のポート疎通確認に進めてよいと判断します。
  4. (動)状況把握のための確認のみを行い、端末やネットワークの設定変更は行いません。
  5. (確)Test-NetConnection server01 -Port 443を実行し、TcpTestSucceededがTrueになっているかを確認して疎通結果を裏付けます。
  6. (残)依頼者には、名前解決の成否・解決されたIPアドレス・443番ポートへの疎通結果を事実として報告し、疎通できない場合は「経路上のファイアウォールまたはserver01側のサービス未起動の可能性がある」といった推測であることを明記し、server01側の設定は未確認である旨を伝えます。
ヒント(使うコマンド名だけ)

使用する主なコマンド:Resolve-DnsNameGet-NetIPConfigurationTest-NetConnection

模範解答を見る(コマンド全文・実行結果の例・解説)
PS> Resolve-DnsName server01

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
server01                                       A      3600  Answer     10.0.20.15

PS> Get-NetIPConfiguration

InterfaceAlias        : イーサネット
IPv4Address           : 10.0.20.101
IPv4DefaultGateway    : 10.0.20.1
DNSServer             : 10.0.20.5

PS> Test-NetConnection server01 -Port 443

ComputerName     : server01
RemoteAddress    : 10.0.20.15
RemotePort       : 443
TcpTestSucceeded : True

Resolve-DnsNameで名前解決ができ、Get-NetIPConfigurationから確認端末が社内ネットワーク(10.0.20.0/24相当)に属し、DNSサーバーも社内のものが設定されていることがわかります。Test-NetConnectionの結果でTcpTestSucceededがTrueであれば、TCP(通信の土台になる決まりごと)のレベルでは疎通(通信が相手まで届くこと)に成功しています。ただしHTTPSの応答内容(証明書やアプリケーションの動作)まではこの確認だけでは判断できないため、実際のWeb画面表示は別途確認が必要です。

8. 総合演習

ここまでの型をすべて使う、卒業試験にあたる1件です。linux-lab.htmlの「重・空・動・記・通・入・壁」も合わせて使います。

案件 No.14 | Lv3 総合・変更を伴う

連休明けの朝、「サーバーに全く繋がらない」と緊急連絡が来た

依頼:「おはようございます、連休明け早々すみません。営業部から『社内ポータルに朝から全く繋がらない』と苦情が来ています。至急、状況を確認して、直せるようなら対応してもらえますか。」

対象は社内向けWebポータルを動かす検証用サーバー(web01)で、緊急対応であっても現状確認と承認の手順は省略しません。

  1. (受)依頼を上長経由で受理し、いつから・どの範囲(全社か一部か)で繋がらないのか、緊急度、連絡してよい相手を確認したうえで、まず「確認を始めます」と一言返信します。
  2. (見)現状を変更せず、サーバーの負荷とメモリ、失敗しているサービスの有無、直近のエラーログ、Webサーバーが待受ポートで応答しているかを、複数のコマンドで順に確認します。
  3. (決)確認結果から「Webサーバーのプロセスが異常終了して止まっている」という仮説を立てます。次に、影響範囲がこのサーバーだけに限られていること、進行中の書き込み処理などがなくデータ損失の懸念がないことを確認します。この2点を確認できた場合に限り、上長へ一言確認したうえで再起動してよいと判断します。
  4. (動)承認を得たうえで、停止している該当サービスをsystemctl restartで再起動します。設定ファイルの変更や不要なサービスの停止は行いません。
  5. (確)再起動直後にサービスの状態が起動中になっているかを確認し、続けてポータルへのHTTPリクエストに正常な応答が返るかを別コマンドで確かめます。
  6. (残)上長と依頼元へ、確認できた事実・そこから立てた推測・まだ確認できていない点を分けて報告し、再発防止のための調査が別途必要かを伝えます。
ヒント(使うコマンド名だけ)

使用する主なコマンド:uptimefreesystemctljournalctlsscurl

模範解答を見る(コマンド全文・実行結果の例・解説)
$ uptime
 09:14:32 up 12 days,  3:41,  1 user,  load average: 0.42, 0.38, 0.35

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3.8Gi       1.1Gi       1.9Gi        45Mi       800Mi       2.5Gi
Swap:          2.0Gi          0B       2.0Gi

$ systemctl --failed
  UNIT            LOAD   ACTIVE SUB    DESCRIPTION
● nginx.service   loaded failed failed A high performance web server

1 loaded units listed.

$ sudo journalctl -p err --since "2 hours ago"
Aug 30 08:03:11 web01 systemd[1]: nginx.service: Main process exited, code=killed, status=9/KILL
Aug 30 08:03:11 web01 systemd[1]: nginx.service: Failed with result 'signal'.

$ sudo ss -tulnp
Netid State  Local Address:Port Peer Address:Port Process
tcp   LISTEN 0.0.0.0:22        0.0.0.0:*        users:(("sshd",pid=812,fd=3))

uptimeとfree -hから、負荷やメモリ不足が原因ではなさそうだと分かります。systemctl --failedでnginxがfailed状態であること、journalctl -p err --since "2 hours ago"-p errは重要度がerr以上のログだけに絞り込み、--sinceは確認する開始時刻を指定するオプションです)の「Main process exited, code=killed, status=9/KILL」という行が見つかります。この行から、プロセスが外部要因で強制終了させられた可能性が読み取れます。ss -tulnpの一覧に80番ポートが出てこないことから、Webサーバーが応答できない状態にあると外形的にも裏付けが取れます。ここまでの確認はすべて参照のみで、まだ何も変更していません。オプションの詳しい意味はLinuxコマンド集のサービスとログも参照してください。

$ sudo systemctl restart nginx

$ systemctl status nginx
● nginx.service - A high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2026-08-30 09:16:02 JST; 5s ago
 Main PID: 15234 (nginx)

$ curl -I --max-time 5 http://localhost
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sun, 30 Aug 2026 00:16:07 GMT
Content-Type: text/html

再起動後はsystemctl statusの表示がactive (running)になっていること、curl -IHTTP/1.1 200 OKが返ってくることの2点がそろって初めて、サービスが外部から見ても応答できる状態に戻ったと判断できます。片方だけでは復旧したと言い切らないよう注意します。

報告例(事実・推測・未確認を分ける):「事実:09:14時点でnginxがfailed状態、80番ポート未待受を確認。09:16に再起動し、active (running)とHTTP 200応答を確認しました。推測:signal 9による強制終了のため、OOM Killerや監視ツールによる停止の可能性があります。未確認:強制終了の直接原因はログの深堀りが必要で、まだ特定できていません。」

signal 9は「プロセスを問答無用で終了させる合図」です。OOM Killerは、メモリが足りなくなったときにLinuxが自動で重いプロセスを強制終了する仕組みを指します。

安全メモ:対象がweb01で間違いないかホスト名を再確認し、再起動前に上長へ一言承認を取ってから実行します。再起動でも復旧しない場合に備え、設定ファイルのバックアップの有無と切り戻し方法を事前に確認し、無関係なサービスやサーバーには一切手を触れません。

9. 報告の型(事実・推測・未確認)

「残」で書く報告は、断定と推測を混ぜないことが重要です。次の4行を基本形にします。

報告の基本形① 事実② 推測③ 未確認④ 次の一手
事実:14:05から nginx への接続が失敗。journalctl でポート80の待受なしを確認。
推測:nginx プロセスが停止している可能性が高い。
未確認:停止した原因(設定変更か異常終了か)は未確認。
次の一手:再起動の承認をいただければ、reload ではなく restart で復旧し、再度確認します。
断定しない理由

「直りました」と言い切る前に、原因未確定のまま再起動だけして再発する例があります。事実と推測を分けて残すと、次に同じ人が対応するときの手掛かりになります。

10. 修了チェックリスト

次のことが自分の言葉で説明できれば、このパックは修了です。

  • 依頼を受けたら、まず現状を確認する(いきなり変更しない)
  • Lv.1〜Lv.3で、コマンドの影響範囲がどう違うか説明できる
  • 参照コマンドと変更コマンドを見分けられる
  • 変更前に対象・目的・影響・退避・戻し方・再確認の6点を確認する習慣がある
  • 結果を「事実・推測・未確認・次の一手」に分けて報告できる
  • Linux(Bash)とWindows(PowerShell)で、同じ調査をそれぞれのコマンドで行える

次はLab形式でさらに深く

案件パックで型を覚えたら、実際の構築・障害演習に進みます。

Linux基本確認へ 8段階の学習ルートへ チケット区分の参考資料