Filesystem 結構:為什麼這樣分
Linux 的目錄結構不是隨機的,每個目錄有明確的用途:
| 目錄 | 用途 | 常見內容 |
|---|---|---|
/etc | 系統設定檔 | nginx.conf, postgresql.conf, /etc/hosts |
/var | 可變資料(程式寫入的) | /var/log, /var/lib/postgresql |
/tmp | 暫存(重開機清除) | socket file, temp files |
/usr/bin | 用戶程式的執行檔 | python3, git, node |
/usr/local | 手動安裝的程式 | homebrew 安裝的工具 |
/home | 用戶 home 目錄 | /home/ubuntu, /home/user |
/root | root 用戶的 home | |
/proc | 虛擬目錄,代表系統狀態 | /proc/1/status(PID 1 的狀態) |
開發者最常碰到:
- App 設定放
/etc/myapp/ - App log 寫到
/var/log/myapp/ - Unix socket 放
/tmp/myapp.sock
Process 管理
# 查看所有 process
ps aux # 包含所有用戶和完整指令
ps aux | grep nginx # 找特定 process
# 即時監控
top # 實時更新,按 q 退出
htop # 更友善的 top(需要安裝)
# Process 關係
ps auxf # 顯示 process tree(parent/child 關係)
pstree # 更清楚的 tree 視圖
# 找到特定 port 的 process
lsof -i :3000 # 誰在用 port 3000
lsof -ti:3000 # 只輸出 PID(方便 pipe 到 kill)
# 結束 process
kill <pid> # SIGTERM(請 process 自己清理後退出)
kill -9 <pid> # SIGKILL(強制立刻殺死)
killall nginx # 殺掉所有名為 nginx 的 process
# 背景執行
nohup ./script.sh & # 背景執行,登出後繼續
nohup ./script.sh > out.log 2>&1 & # 輸出到檔案File Permissions
-rw-r--r-- 1 alice dev 1024 Apr 27 12:00 config.yml
│├─┤├─┤├─┤
│ │ │ └── others 的權限(r-r:只讀)
│ │ └───── group(dev)的權限(r-r:只讀)
│ └──────── owner(alice)的權限(rw-:讀寫)
└────────── 檔案類型(-: file, d: directory, l: symlink)
r = 4, w = 2, x = 1(八進位的來源)
# 常用權限設定
chmod 644 file.txt # rw-r--r--(一般檔案)
chmod 755 script.sh # rwxr-xr-x(可執行)
chmod 600 id_rsa # rw-------(private key,只有 owner 讀寫)
chmod -R 755 directory/ # 遞迴設定目錄
# 為什麼不用 chmod 777?
# 777 = rwxrwxrwx = 所有人可讀寫執行
# 對 private key:任何人都能讀 → SSH 直接拒絕你用這個 key
# 對 web server:任何人都能寫入 → 安全漏洞
# 改擁有者
chown alice file.txt # 改 owner
chown alice:dev file.txt # 改 owner + group
chown -R www-data /var/www/ # 遞迴(常見於 web server 設定)為什麼開發者要懂這些
Debug Docker:容器裡 permission denied,可能是 chown 問題或 container user 和 volume mount 的 ownership 不符。
CI/CD:./deploy.sh: Permission denied——忘了 chmod +x,或 git 沒有保留執行權限(git update-index --chmod=+x)。
Log 設定:app 要寫 /var/log/myapp/,但這個目錄屬於 root,app 跑在 www-data 用戶——需要 chown 或在 directory 上設正確的 group 權限。