本日主題:查系統資源、管理服務、理解檔案權限 預計時間:1.5 小時 對應主教材:第 3.2 節
一、今日學習目標
- [ ] 會查 CPU/記憶體/磁碟/程序
- [ ] 會查與重啟服務
- [ ] 看懂 Linux 權限(含 755 的意義)
- [ ] 理解 sudo 與使用者管理
- [ ] 會設定 cron 排程
二、教材內容
2.1 看系統資源
# --- CPU 與程序 ---
top # 即時看 CPU/記憶體與程序
# 按 P → 依 CPU 使用率排序
# 按 M → 依記憶體排序
# 按 k → 殺掉指定 PID 的程序
# 按 q → 離開
htop # 更直覺的版本(需先安裝:apt install htop)
uptime # 看系統開機多久、負載
# 輸出範例:14:30 up 5 days, 2:15, 3 users, load average: 0.15, 0.20, 0.18
# load average 三個數字分別是 1/5/15 分鐘平均負載
# --- 記憶體 ---
free -h # 看記憶體用量(-h 人類可讀,GB/MB)
# 輸出範例:
# total used free shared buff/cache available
# Mem: 7.8Gi 2.1Gi 3.2Gi 150Mi 2.5Gi 5.3Gi
# Swap: 2.0Gi 0.0Gi 2.0Gi
# --- 磁碟 ---
df -h # 看磁碟空間(-h 人類可讀,GB/MB)
# 輸出範例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 40G 15G 23G 40% /
df -ih # 看 inode 使用量(小檔案太多可能 inode 用完)
du -sh /var/log # 查看特定目錄的磁碟佔用
du -h --max-depth=1 /var # 看 /var 下每個子目錄的大小
lsblk # 列出所有區塊裝置(硬碟、分割區)
# --- 程序 ---
ps aux # 列出所有執行中程序
ps aux | grep nginx # 找特定程序
kill PID # 終止指定 PID 的程序
kill -9 PID # 強制終止(最後手段)
killall nginx # 終止所有名為 nginx 的程序
top 輸出解讀
top - 14:30:05 up 5 days, 2:15, 3 users, load average: 0.15, 0.20, 0.18
Tasks: 120 total, 1 running, 119 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.5 us, 1.0 sy, 0.0 ni, 96.0 id, 0.5 wa, 0.0 hi, 0.0 si
MiB Mem : 7980.0 total, 3200.0 free, 2100.0 used, 2680.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5300.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 www-data 20 0 500000 80000 30000 S 5.0 1.0 2:30.50 nginx
5678 mysql 20 0 800000 250000 40000 S 3.0 3.1 10:20.30 mysqld
| 欄位 | 說明 |
|---|---|
| load average | 1/5/15 分鐘平均等待 CPU 的程序數。值 < CPU 核心數 = 正常 |
| us | 使用者空間 CPU 使用率 |
| sy | 系統核心 CPU 使用率 |
| id | 閒置百分比(idle),越高代表越閒 |
| wa | 等待 I/O 的百分比,過高代表磁碟太慢 |
| %CPU | 該程序佔用的 CPU 百分比 |
| %MEM | 該程序佔用的記憶體百分比 |
| RES | 實際使用的物理記憶體 |
排錯思路:系統變慢 →
top看誰吃 CPU/記憶體;磁碟滿 →df -h看哪個分割區滿了;然後du -h --max-depth=1 /var找出佔空間的目錄。
2.2 服務管理(systemctl)
systemctl status nginx # 看服務狀態(active/failed/inactive)
systemctl start nginx # 啟動
systemctl stop nginx # 停止
systemctl restart nginx # 重啟(先停再啟,會斷線)
systemctl reload nginx # 重新載入設定(不斷線,比 restart 溫和)
systemctl enable nginx # 設定開機自動啟動
systemctl disable nginx # 取消開機自動啟動
systemctl is-active nginx # 快速查詢是否在跑
systemctl is-enabled nginx # 快速查詢是否開機自啟
# 查看所有服務
systemctl list-units --type=service --state=running # 正在跑的服務
systemctl list-units --type=service --state=failed # 失敗的服務
# 查看服務的日誌
journalctl -u nginx # 查看 nginx 服務的日誌
journalctl -u nginx -f # 即時追蹤 nginx 日誌
journalctl -u nginx --since "2024-01-01" --until "2024-01-02" # 指定時間範圍
systemctl status 輸出解讀
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 08:30:00 CST; 3 days ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 3 (limit: 4652)
Memory: 10.5M
CPU: 30.520s
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx
├─1235 nginx: worker process
└─1236 nginx: worker process
enabled= 開機自動啟動active (running)= 正在運行Main PID= 主程序的 PID
2.3 檔案權限(面試會考)
ls -l 看到的權限長這樣:
-rwxr-xr-- 1 user group 1234 Jan 15 08:30 script.sh
│└┬┘└┬┘└┬┘ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ └ 檔名
│ │ │ │ │ │ │ │ └ 修改時間
│ │ │ │ │ │ │ └ 檔案大小(bytes)
│ │ │ │ │ │ └ 群組
│ │ │ │ │ └ 擁有者
│ │ │ │ └ 硬連結數
│ │ │ └ 其他人(others):r--(唯讀)
│ │ └─── 同群組(group):r-x(可讀可執行)
│ └────── 擁有者(owner):rwx(可讀可寫可執行)
└──────── 檔案類型(- 檔案、d 目錄、l 符號連結)
權限數字:r=4、w=2、x=1,三個加總:
- 7 = rwx(4+2+1)= 可讀+可寫+可執行
- 6 = rw-(4+2)= 可讀+可寫
- 5 = r-x(4+1)= 可讀+可執行
- 4 = r--(4)= 唯讀
- 0 = ---(0)= 無權限
常見權限數字組合
| 數字 | 權限 | 典型用途 |
|---|---|---|
| 755 | rwxr-xr-x | 可執行的腳本、程式 |
| 644 | rw-r--r-- | 一般設定檔、文件 |
| 700 | rwx------ | 私密的腳本(只有擁有者能用) |
| 600 | rw------- | 私密檔案(如 SSH 私鑰) |
| 777 | rwxrwxrwx | 全部人都能做任何事(不安全,盡量避免) |
所以 chmod 755 script.sh = 擁有者 rwx、群組 r-x、其他 r-x。
chmod 755 script.sh # 改權限(數字模式)
chmod +x script.sh # 加上可執行(符號模式)
chmod u+w,g-w file.txt # 擁有者加寫、群組移除寫
chmod -R 755 /opt/app # 遞迴改整個目錄的權限
chown user:group file # 改擁有者與群組
chown -R www-data:www-data /var/www # 遞迴改整個目錄的擁有者
2.4 使用者管理
# 查看使用者
whoami # 我是誰
id # 顯示 UID、GID、所屬群組
cat /etc/passwd # 所有使用者清單
cat /etc/group # 所有群組清單
# 管理使用者
sudo useradd -m -s /bin/bash user01 # 建立使用者(-m 建家目錄、-s 指定 shell)
sudo passwd user01 # 設定/修改密碼
sudo usermod -aG sudo user01 # 把 user01 加入 sudo 群組(-a = append)
sudo userdel -r user01 # 刪除使用者(-r 連家目錄一起刪)
# sudo 的意義
sudo command # 以 root 權限執行指令(需要輸入自己的密碼)
sudo su # 切換成 root(不建議長時間使用 root)
sudo -l # 查看自己有哪些 sudo 權限
面試加分小知識:Linux 的使用者資訊存在
/etc/passwd,密碼雜湊值存在/etc/shadow(只有 root 能讀)。這是基本的安全設計。
2.5 cron 排程(定時任務)
cron 是 Linux 的排程工具,可以設定定時執行的任務(如備份、清 log、健康檢查)。
# 編輯目前使用者的 cron 排程
crontab -e
# 查看目前的 cron 排程
crontab -l
# cron 格式:
# 分 時 日 月 星期幾 指令
# * * * * * command
# 範例:
# 每天凌晨 2 點執行備份腳本
0 2 * * * /opt/scripts/backup.sh
# 每 5 分鐘檢查一次服務狀態
*/5 * * * * /opt/scripts/health_check.sh
# 每週一早上 8 點清理暫存
0 8 * * 1 find /tmp -mtime +7 -delete
# 每月 1 號凌晨 3 點執行磁碟使用報告
0 3 1 * * df -h > /var/reports/disk_$(date +\%Y\%m\%d).txt
cron 格式速記
┌──────── 分鐘 (0-59)
│ ┌────── 小時 (0-23)
│ │ ┌──── 日期 (1-31)
│ │ │ ┌── 月份 (1-12)
│ │ │ │ ┌ 星期幾 (0-7,0和7都是週日)
│ │ │ │ │
* * * * * command
| 符號 | 意義 | 範例 |
|---|---|---|
* |
每一個 | 每分鐘/每小時… |
*/5 |
每隔 5 | 每 5 分鐘 |
1,15 |
第 1 和 15 | 1 號和 15 號 |
1-5 |
1 到 5 | 週一到週五 |
2.6 常見誤解
| 誤解 | 正確觀念 |
|---|---|
free 顯示 used 很高代表記憶體不足 |
Linux 會把閒置記憶體拿來當 cache,要看 available 欄位才是真正可用的 |
chmod 777 是最安全的設定 |
完全相反!777 代表所有人都能做任何事,是最不安全的。應該給最小需要的權限 |
| root 可以做任何事所以應該一直用 root | 平時應該用一般使用者 + sudo,避免誤操作毀損系統 |
kill 指令一定會殺掉程序 |
普通的 kill 是發送 SIGTERM(請求終止),程序可以攔截。kill -9 才是強制終止 |
三、今日練習
Q1. 查磁碟空間、記憶體、即時程序,分別用什麼指令?
Q2. 重啟一個叫 mysql 的服務、並設定開機自動啟動?
Q3. chmod 644 file.txt 代表什麼權限?
Q4. 請寫出一個 cron 排程:每天凌晨 3 點執行 /opt/backup.sh。
Q5. 系統管理員反映磁碟空間快滿了,你會用什麼指令來排查是哪個目錄佔最多空間?
參考解答
**A1.** `df -h`、`free -h`、`top`。 **解題說明**: - `df -h`(disk free):顯示每個分割區的總容量、已用、可用空間和使用百分比。`-h` 讓大小以 GB/MB 顯示。 - `free -h`:顯示記憶體(RAM)的總量、已用、可用和 swap 使用狀況。注意要看 `available` 欄位而非 `free`,因為 Linux 會把閒置記憶體當 cache 使用。 - `top`:即時顯示 CPU 使用率、記憶體使用率、各程序的資源消耗。按 P 可依 CPU 排序,按 M 依記憶體排序。 **A2.** `systemctl restart mysql` 然後 `systemctl enable mysql`。 **解題說明**: - `restart` 會先停止服務再啟動,確保套用最新設定 - 如果只是修改了設定檔,用 `reload` 更溫和(不斷線) - `enable` 設定開機自動啟動(在 systemd 建立 symbolic link) - 可以合併:`systemctl enable --now mysql`(同時啟用並啟動) - 驗證:`systemctl status mysql` 確認狀態為 active,且顯示 enabled **A3.** 644 = 擁有者 rw-(6)、群組 r--(4)、其他 r--(4),即擁有者可讀寫、其他人只能讀。 **解題說明**: - 6 = 4(r) + 2(w) + 0(-) = rw-(可讀+可寫) - 4 = 4(r) + 0(-) + 0(-) = r--(只讀) - 644 是設定檔的標準權限,表示擁有者可以編輯,其他人只能查看不能修改 - 常見於 `/etc` 下的設定檔、HTML 檔案等 **A4.** `0 3 * * * /opt/backup.sh` **解題說明**:cron 格式為「分 時 日 月 星期 指令」: - 分 = 0(整點) - 時 = 3(凌晨 3 點) - 日 = *(每天) - 月 = *(每月) - 星期 = *(不限定星期幾) - 指令 = `/opt/backup.sh` 使用 `crontab -e` 編輯後存檔即生效。建議在腳本中加入 log 輸出以便追蹤執行狀況:`0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1` **A5.** 排查步驟: 1. 先用 `df -h` 確認是哪個分割區快滿(如 `/` 或 `/var`) 2. 用 `du -h --max-depth=1 /` 看根目錄下每個子目錄的大小,找出最大的 3. 逐層深入:`du -h --max-depth=1 /var` → `du -h --max-depth=1 /var/log` 4. 常見佔空間的原因: - `/var/log` 下的日誌檔過大 → 設定 logrotate - `/tmp` 下的暫存檔未清理 → 清除舊暫存 - 應用程式的 cache 或 dump 檔案 → 清理或搬移 5. 也可用 `find / -type f -size +100M -exec ls -lh {} \;` 找出大於 100MB 的檔案四、今日檢核
- [ ] 我會查系統資源與程序
- [ ] 我會用 systemctl 管理服務
- [ ] 我看得懂並能設定 Linux 權限
- [ ] 我會設定 cron 排程
- [ ] 我知道如何排查磁碟空間不足的問題
五、延伸閱讀
- 鳥哥的 Linux 私房菜 — 帳號管理與 ACL 權限設定
- systemd 與 systemctl 完整指南
- crontab guru — cron 排程產生器
- Linux Performance Analysis in 60 seconds
⬅️ 上一天:Day 1 | 🏠 本週總覽 | ➡️ 下一天:Day 3 — 虛擬化