Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

命令手動能跑,crontab 卻失敗?改腳本前先重建 cron 上下文

先證明 cron 真的啟動該行,再比較使用者、shell、環境、工作目錄與輸出路徑,並驗收一次真正排程執行。

互動終端與獨立 cron 執行上下文的原創比較圖。
Watch at Ease 原創示意插畫:同一命令進入不同的排程環境。 Watch at Ease

命令在互動終端成功,不代表 cron 擁有相同的程序上下文。實際使用者、shell、PATH、HOME、工作目錄、密鑰來源與輸出處理都可能不同。

不要先放寬權限或載入整份登入設定。先證明是否啟動,擷取一次執行,以最小環境重現,再只補缺少的依賴。

1. 證明 cron 嘗試執行

編輯前讀取實際 crontab、cron/crond 狀態與排程分鐘的系統日誌。沒有排程事件、已啟動 shell、程式回傳非零,是三種不同問題。

對一次受控執行,把 stdout、stderr 寫入受保護的絕對路徑,並追加數字結束碼與時間戳。若系統寄送輸出,要另外驗證投遞。

2. 確認正確的 crontab 與使用者

記錄該行來自使用者 crontab、root crontab、/etc/crontab 或 /etc/cron.d。系統表多一個使用者欄位,直接複製會改變解析。

以真正排程帳戶記錄 id、群組、HOME、SHELL 與完整 crontab。編輯者不一定是執行者。

3. 建立上下文差異表

只比較工作需要的 PATH、語系、代理、應用設定與憑證檔位置。手冊說 cron 設定 SHELL、HOME、LOGNAME,而部分值可在 crontab 覆寫。

不要把完整環境輸出到公開日誌;其中可能含權杖。記錄變數名稱與脫敏存在狀態,並用絕對解譯器與程式路徑驗證查找。

4. 明確指定路徑與工作目錄

Cron 不保證從腳本目錄開始。使用明確的 cd -- /絕對/專案 && 命令,或把輸入、輸出、鎖檔與暫存路徑全部絕對化。

以排程使用者檢查目錄搜尋權限,並確認檔案位於同一命名空間。root 終端測試不能證明一般使用者 cron 可存取。

5. 不等待下次排程也能重現

以排程使用者配合 env -i,只保留預期 HOME、PATH、SHELL 與已審查變數。這能立刻重建邊界,不必等下一個時刻。

使用 crontab 相同的解譯器與工作目錄。精簡測試失敗就追上下文或程式假設;成功才回查排程、daemon 或政策。

6. 只修一項依賴並驗收

只加入缺少的路徑、變數、目錄切換、憑證檔或服務依賴。不了解副作用就不要載入整份互動設定,也不要把秘密放入可讀的 crontab 或日誌。

安排一次短測試,要求開始、完成、結束碼和預期產物全部出現。之後恢復正式頻率、移除暫時除錯輸出並保留脫敏台帳。

cron 證據台帳匯聚成一次成功執行的原創圖。
Watch at Ease 原創示意插畫:修復前證明身分、環境、目錄、解譯器與輸出。 Watch at Ease