定時任務運行正常,但放入 crontab 後 Shell 腳本靜默失敗、無輸出、命令不存在?90% 是因為 **Cron 運行環境極度精簡**:無 PATH、無 HOME、無交互式 Shell 配置(.bashrc/.profile 不加載)。本文給出標準修復模板與調試技巧。
#!/bin/bash
# ==== 必須放在腳本最頂部,所有命令之前 ====
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 根據實際情況補充:/opt/xxx/bin, /usr/local/mysql/bin 等
# ============================================
# 其餘業務邏輯...
cd /path/to/project
./do_backup.sh >> /var/log/backup.log 2>&1
| 差異項 | 交互式 Shell | Cron 環境 |
|---|---|---|
| PATH | 完整 (含 /usr/local/bin 等) | /usr/bin:/bin |
| HOME | /home/user | / (或 /root) |
| SHELL | /bin/bash | /bin/sh (Dash, 功能較弱) |
| 環境變量 | 載入 .bashrc/.profile | 僅載入 /etc/environment 和 crontab 內定義 |
| 當前目錄 | 登錄目錄 | 用戶家目錄 |
/usr/bin/docker # 而非 docker
/opt/python3.9/bin/python3 # 而非 python3
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="ops@example.com" # 錯誤郵件通知
# 任務
0 * * * * /opt/scripts/hourly_backup.sh
*/20 6-12 * 12 * /usr/bin/backup
0 17 * * 1-5 /usr/bin/mail -s "hi" alex@domain.name < /tmp/maildata
20 0-23/2 * * * echo "haha"
* * * * * /path/script.sh >> /tmp/script.log 2>&1env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=/root /path/script.sh
mail 或 /var/mail/root 查看 Cron 發送的錯誤輸出。%` 在 crontab 中有特殊含義(換行),需轉義 \%` 或放入腳本。cd 相對路徑失敗 → 用絕對路徑或 cd /abs/path || exit 1。notify-send、xrandr)需 DISPLAY=:0、XAUTHORITY。journalctl -u foo.timer)。遵循「腳本自帶 PATH、命令用絕對路徑、輸出重定向到日誌」三原則,Crontab 定時任務將極其穩健。