本日主題:查系統資源、管理服務、理解檔案權限 預計時間: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.shQ5. 系統管理員反映磁碟空間快滿了,你會用什麼指令來排查是哪個目錄佔最多空間?

參考解答 **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 排程
  • [ ] 我知道如何排查磁碟空間不足的問題

五、延伸閱讀


⬅️ 上一天:Day 1 | 🏠 本週總覽 | ➡️ 下一天:Day 3 — 虛擬化