# 初心者向けエラーFAQ

分からない言葉が出てきたら、まず[用語集](./glossary.md)で意味を確認します。

## まず行うこと

> **かんたんに言うと** エラーが出たら、まず手を止めます。画面に出た文字をそのまま残し、意味を確かめてから、直す操作は1つだけ試します。

1. 追加操作を止める。慌てて操作を重ねると状況が変わり、原因が分からなくなるため。
2. エラーの全文、発生した時刻、今いる場所(`pwd`の結果)、直前に実行したコマンドを保存する。後から原因をたどるときと、人に相談するときに必要になるため。
3. パスワード、トークン(サービスへの接続に使う認証用の文字列)、秘密鍵、実際に使っているIPアドレスは、共有用の記録から除く。そのまま公開すると、他人に悪用される危険があるため。
4. 次の表で意味を確認し、対象が合っているか見直してから、対処は1つだけ試す。一度に複数を変えると、どれが効いたのか説明できなくなるため。

表の中では次の言葉を使います。

- シェル: 入力したコマンドを解釈するソフトです。
- `sudo`: 一時的に管理者の権限でコマンドを実行するための指定です。
- ポート: 1台の機器の中で、通信の窓口を番号で分けたものです。
- サービス(デーモン): 画面を閉じても背後で動き続けるプログラムです。
- ファイアウォール / security group: 通信を条件によって許可・拒否する仕組みです。security groupはクラウド側でその設定を行うものです。
- `ss -lntp`: 今どのポートで待ち受けているかを一覧表示するコマンドです。

| 表示・現象 | 主な意味 | 最初に確認 | 対処法 | 避けること |
|---|---|---|---|---|
| `command not found` | コマンド名の誤り、またはまだインストールしていない | 綴り、使っているシェル、教材の前提 | 綴りを見直し、教材が前提とするシェル / OSで再実行する | 意味の分からないインストール手順をそのまま実行する |
| `Permission denied` | 実行・読取・変更権限がない | `whoami`、`pwd`、`ls -l <対象>` | 所有者と権限を`ls -l`で確認する。必要な範囲だけ`sudo`を付けて再実行する | 理由を確かめずに`sudo`や`chmod 777`(誰でも読み書き・実行できる設定)を付ける |
| `No such file or directory` | 指定した場所に対象がない | `pwd`、`ls -la`、大文字小文字 | `pwd`で現在地、`ls -la`で対象名の綴り・大文字小文字を確認してから再実行する | 推測した絶対パスで削除する |
| sudoで文字が出ない | 打った文字を画面に表示しない仕様。入力自体は届いている | 自分のパスワードを入力してEnter | そのまま自分のパスワードを入力しEnterを押す(貼り付けや連打はしない) | 何度も貼り付ける、パスワードを記録する |
| `>`で内容が消えた | `>`は書き込み先のファイルを丸ごと上書きするため | シェルの履歴、バックアップ、Gitの差分 | バックアップやGitの差分から復元できるか確認する。以後は末尾に追記する`>>`を使うか、先にバックアップを取る | 同じファイルへさらに書き込む |
| SSHのhost確認が出た | 初めて見る接続先の鍵を確認中([fingerprint](./glossary.md#term-fingerprint)は鍵の内容を短く要約した値) | hostname、IP、fingerprintを別経路で照合 | 個人学習環境では、クラウドの管理画面やVM(仮想マシン)作成時のコンソール出力に出るfingerprintを控える。接続時にターミナルへ表示された値と一致するときだけ`yes`と答える | 不明なまま`yes`と答える |
| `Connection refused` | 相手には届いたが、そのポートで受け付けていない | 宛先、ポート番号、`ss -lntp`の結果、サービスの起動状態 | `ss -lntp`で対象のサービスがそのポートで待ち受けているか確認する。停止していれば起動してから再接続する | ファイアウォールだけを何度も変更する |
| `Connection timed out` | 経路の途中で応答が返ってこない | IPアドレス、経路、ファイアウォール、接続元の制限 | 経路上のファイアウォールや接続元の制限(クラウドのsecurity groupなど)で、対象のIPアドレスとポートが許可されているか確認する | service再起動だけで直そうとする |
| Docker daemonへ接続不可 | daemon停止または利用権限不足 | `systemctl status docker`、利用環境 | `sudo systemctl status docker`でdaemonが動いているか確認する。停止していれば起動してから再実行する | socket(プログラムが通信をやり取りする出入口)へ広すぎる権限を付ける |
| WSLを閉じると停止する | WSL(Windowsの中でLinuxを動かす仕組み)を閉じると、その中で動いていたプログラムも一緒に終了する | `wsl --list --verbose`、再現条件 | 学習用の一時停止として扱い、常時稼働が必要なら独立VMなど別方式を検討する | 独立VMの常時稼働実績として扱う |

## 端末から抜けられない

> **かんたんに言うと** 画面が固まったように見えても、多くの場合は壊れていません。今開いている画面ごとに、抜けるためのキーが決まっています。

| 画面 | 終了操作 |
|---|---|
| `less` / `man` | `q` |
| `nano` | `Ctrl`+`X`。保存確認を読んで選ぶ |
| `vim` | `Esc`、変更を破棄する場合は `:q!`、保存する場合は内容確認後 `:wq` |
| 実行中のコマンド(入力欄が戻ってこない状態) | 中断しても安全だと分かる場合だけ `Ctrl`+`C`。書き込み中に止めるとファイルが壊れることがある |
| SSH接続 | `exit` |

## 複数行を誤って貼り付けた

> **かんたんに言うと** 貼り付けた行がまだ実行されていなければ取り消せます。実行されてしまった場合は、やり直さずに記録を残して相談します。

行の先頭に継続入力の記号（`>`など。コマンドがまだ途中だとシェルが判断している印）が出ていれば、まだ実行前です。この場合は`Ctrl`+`C`で入力を取り消します。すでに実行された場合は、同じコマンドを再実行しません。再実行すると変更が二重に適用され、状況がさらに分かりにくくなるためです。`history`、時刻、変更対象を記録します。削除、権限、Firewall、SSHを含む場合は[質問テンプレート](./question-template.md)を使って相談します。
