タイトル: エラー一覧
SEOタイトル: Linux よくあるエラー集(Permission denied / No such file / command not found 他)
| この記事の要点 |
|
このページについて
Linux で開発・運用していて頻出するエラーメッセージと、その原因 / 対処を一覧でまとめます。詳細は各記事を参照してください。
権限・ファイル系
Permission denied
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ mkdir /opt/app
mkdir: cannot create directory '/opt/app': Permission denied
原因: 実行権限なし / 読み取り権限なし / 親ディレクトリへの書込権限なし / SELinux / AppArmor。
対処:
# 1. 権限の確認
ls -la deploy.sh
# -rw-r--r-- 1 user user 100 Jun 10 deploy.sh ← x が無い
# 2. 実行権限付与
chmod +x deploy.sh
chmod 755 deploy.sh
# 3. 所有者を変更
sudo chown user:user deploy.sh
# 4. ディレクトリの場合は再帰
sudo chown -R user:user /opt/app
sudo chmod -R 755 /opt/app
# 5. sudo で実行
sudo ./deploy.sh
# 6. SELinux / AppArmor の確認
getenforce # SELinux 状態
sudo ausearch -m AVC -ts recent # SELinux 拒否ログ
sudo aa-status # AppArmor 状態
No such file or directory
$ cat config.yml
cat: config.yml: No such file or directory
$ ./script.sh
-bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
# ↑ 改行コードが CRLF(Windows 起源)
意外な原因:
- シェバン行の改行コードが CRLF →
dos2unix script.sh - シェバン行のインタプリタパス間違い (
/bin/pythonなのに/usr/bin/python) → 修正 or symlink - 32bit バイナリを 64bit OS で実行 →
sudo apt install libc6-i386/lddで確認 - 動的ライブラリが見つからない →
ldd a.outで「not found」を確認、LD_LIBRARY_PATH設定 or/etc/ld.so.conf.d/に追記 +ldconfig
Read-only file system
$ touch /mnt/data/file
touch: cannot touch '/mnt/data/file': Read-only file system
- ファイルシステム破損で自動的に ro 再マウントされている →
dmesg確認、fsck - SD カードのライトプロテクト
- 意図的に ro マウントされている →
mount -o remount,rw /mnt/data
Disk quota exceeded / No space left on device
$ touch large.bin
touch: cannot touch 'large.bin': No space left on device
# 残量確認(ブロック)
df -h
df -i # inode(i ノード枯渇の場合)
# 使用量の多いディレクトリを探す
du -sh /var/* 2>/dev/null | sort -h | tail
sudo du -hcx --max-depth=1 / | sort -h
# ログ圧縮 / 削除
sudo journalctl --vacuum-time=7d
sudo apt clean
sudo rm -rf /var/log/old/*.log
# 古いカーネル削除
sudo apt autoremove --purge
コマンド系
command not found
$ git
-bash: git: command not found
# 1. パスを確認
which git
type -a git
echo $PATH
# 2. インストール
sudo apt install git # Debian / Ubuntu
sudo dnf install git # RHEL / CentOS / Fedora
brew install git # macOS
# 3. PATH に追加
export PATH="$HOME/.local/bin:$PATH" # ~/.bashrc に追記
# 4. sudo で動かしたいのに見つからない場合
sudo env "PATH=$PATH" mycmd
# /etc/sudoers の secure_path を確認
Bad fd number / Argument list too long
$ rm *.log
-bash: /bin/rm: Argument list too long
# 原因: ファイル数が ARG_MAX 超え
getconf ARG_MAX # 2097152 等
# 対処: xargs / find -delete
find . -name "*.log" -delete
find . -name "*.log" -print0 | xargs -0 rm
プロセス・メモリ系
Segmentation fault (core dumped)
$ ./a.out
Segmentation fault (core dumped)
# core ファイル生成を有効化
ulimit -c unlimited
# 生成先 (Ubuntu は apport, RHEL は /var/lib/systemd/coredump)
cat /proc/sys/kernel/core_pattern
# gdb で解析
gdb ./a.out /var/lib/systemd/coredump/core.a.out.*
(gdb) bt # スタックトレース
# 実行時の追跡
strace -f -o trace.log ./a.out
ltrace ./a.out
# dmesg にも記録される
dmesg | tail
Out of memory (OOM Killer)
$ java -Xmx8g -jar app.jar
Killed
# OOM 確認
dmesg | grep -i oom
journalctl -k | grep -i oom
# 例: "Out of memory: Killed process 12345 (java) total-vm:..."
# 対処
# 1. メモリ追加 or アプリのメモリ削減
# 2. swap を増やす
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 3. cgroup でアプリのメモリ上限を明示
# 4. 重要プロセスを OOM 対象から外す
echo -1000 > /proc/$(pidof important)/oom_score_adj
Device or resource busy
$ umount /mnt/usb
umount: /mnt/usb: target is busy.
# 誰が掴んでいるか
sudo lsof +D /mnt/usb
sudo fuser -m /mnt/usb
# プロセス強制終了
sudo fuser -mk /mnt/usb
# 遅延アンマウント
sudo umount -l /mnt/usb
I/O 系
| エラー | 意味 | 確認方法 |
|---|---|---|
Input/output error | ディスク故障 / ネットワーク FS 切断 | dmesg, smartctl -a /dev/sda |
Too many open files | fd 上限到達 | ulimit -n, /etc/security/limits.conf |
Connection refused | 該当ポートで listen されていない | ss -tlnp, systemctl status |
Connection timed out | 到達不可・ファイアウォール | traceroute, nc -vz |
E2BIG | 引数リストが大きすぎる | xargs で分割 |
ENOSPC | 空き容量不足 | df -h, df -i |
EMFILE | プロセスごとの fd 上限 | ulimit -n |
ENFILE | システム全体の fd 上限 | cat /proc/sys/fs/file-max |
SELinux 関連
# SELinux が原因か切り分け
sudo setenforce 0 # 一時的に Permissive モード
# → エラーが消えれば SELinux が原因
# 監査ログ
sudo ausearch -m AVC -ts recent
sudo sealert -a /var/log/audit/audit.log
# 個別許可(policycoreutils-python-utils 必要)
sudo audit2allow -a -M mypolicy
sudo semodule -i mypolicy.pp
# 元に戻す
sudo setenforce 1
ログを確認する場所
| ログ | 内容 | コマンド |
|---|---|---|
dmesg | カーネルメッセージ(OOM、ハードウェアエラー) | dmesg -T \| tail |
journalctl | systemd 統合ログ | journalctl -xe, journalctl -u nginx -f |
/var/log/syslog or /var/log/messages | システム全般 | tail -F |
/var/log/auth.log | 認証関連(sudo / ssh) | tail -F |
/var/log/audit/audit.log | SELinux 監査 | ausearch |
原因不明時の汎用デバッグ手順
- 正確なエラーメッセージをコピーして検索(コード番号 / プロセス名込みで)
strace -f -e trace=openat,access,connectでシステムコール追跡ltraceで動的ライブラリ呼び出し追跡dmesg -Tでカーネル直近メッセージjournalctl -xeで systemd 統合ログ- 該当パスの権限と SELinux コンテキスト(
ls -laZ)
FAQ
Q: エラーメッセージが英語で読めない
A: LANG=ja_JP.UTF-8 で日本語化されるパターンもあるが、英語で検索したほうが情報量が多い。OS 全体は英語、必要に応じてコマンド単発で LANG=C を付けるのが定石。
Q: core ファイルが生成されない
A: ulimit -c unlimited がデフォルト 0 になっていることが多い。Ubuntu は apport が捕捉、RHEL は systemd-coredump が捕捉する設定の違いも要確認。
Q: dmesg が「Operation not permitted」になる
A: kernel.dmesg_restrict=1 の影響。sudo dmesg か、sudo sysctl kernel.dmesg_restrict=0 で一時的に開放。