萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux Crontab 定時任務中 Shell 腳本不執行?缺失環境變量是主因

定時任務運行正常,但放入 crontab 後 Shell 腳本靜默失敗、無輸出、命令不存在?90% 是因為 **Cron 運行環境極度精簡**:無 PATH、無 HOME、無交互式 Shell 配置(.bashrc/.profile 不加載)。本文給出標準修復模板與調試技巧。

核心修復:腳本頭部注入 PATH

#!/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

為什麼會失敗?

差異項交互式 ShellCron 環境
PATH完整 (含 /usr/local/bin 等)/usr/bin:/bin
HOME/home/user/ (或 /root)
SHELL/bin/bash/bin/sh (Dash, 功能較弱)
環境變量載入 .bashrc/.profile僅載入 /etc/environment 和 crontab 內定義
當前目錄登錄目錄用戶家目錄

進階最佳實踐

1. 使用絕對路徑

/usr/bin/docker  # 而非 docker
/opt/python3.9/bin/python3  # 而非 python3

2. 在 crontab 文件頭部統一定義環境

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"

3. 調試三板斧

  1. 重定向輸出:* * * * * /path/script.sh >> /tmp/script.log 2>&1
  2. 模擬 Cron 環境測試:
env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=/root /path/script.sh
  1. 檢查郵件:mail 或 /var/mail/root 查看 Cron 發送的錯誤輸出。

常見坑點清單

  • %` 在 crontab 中有特殊含義(換行),需轉義 \%` 或放入腳本。
  • 腳本內 cd 相對路徑失敗 → 用絕對路徑或 cd /abs/path || exit 1。
  • 圖形界面程序(notify-send、xrandr)需 DISPLAY=:0、XAUTHORITY。
  • systemd.timer 替代 Cron:更精確、支持依賴、日誌集中(journalctl -u foo.timer)。

遵循「腳本自帶 PATH、命令用絕對路徑、輸出重定向到日誌」三原則,Crontab 定時任務將極其穩健。

copyright © 萬盛學電腦網 all rights reserved