Shell
記錄整個 && 命令鏈的錯誤(在 Cron 作業中)
在我的一個 cronjobs 中,我有一個長
&&
鏈命令,在它的最後,我放了2>>/home/myparadise/public_html/wp-content/uploads/import/files/raytheon/raytheon_log_error.txt
- 表示我希望任何錯誤都進入文件raytheon_log_error.txt
cd /home/myparadise/public_html/wp-content/uploads/import/files/raytheon && wget "https://www.raytheonsystems.com/test" -O raytheon_direct.zip && unzip -q raytheon_direct.zip && rm -f raytheon_direct.zip && csvjoin --left -c "MANUFACTURER SKU,MPN" $(ls -Art ASH* | tail -n 1) /home/myparadise/public_html/wp-content/uploads/import/files/raytheon/raytheon2_multi_images_only.csv > raytheon_new_joined.csv && wget -q -O - "https://www.myparadise.com.au/wp-load.php?import_key=XXXX&import_id=111&action=trigger" 2>>/home/myparadise/public_html/wp-content/uploads/import/files/raytheon/raytheon_log_error.txt
但是,我從未收到該文件的錯誤。現在,我不能 100% 確定我期待什麼錯誤,但有理由認為,由於最後一個命令從未執行過,因此在此過程中發生了一些故障。 (編輯:我隨後發現該錯誤與權限相關:
raytheon_direct.zip: Permission denied
-但是,問題仍然存在,因為我希望將來記錄任何此類和所有錯誤。)我該如何解決這個問題,以便如果其中一個
&&
命令塊失敗,那麼它將被記錄為錯誤raytheon_log_error.txt
,包括具體原因?
您可以將鏈包裝在子 shell 或命令組中,並重定向錯誤流:
(cmd1 && cmd2 && cmd3) 2>>/path/to/errorfile
或者
{ cmd1 && cmd2 && cmd3; } 2>>/path/to/errorfile
例如
$ crontab -l | tail -1 * * * * * { date && touch /root/file && date; } 2>> ~/cron.log $ tail cron.log touch: cannot touch '/root/file': Permission denied touch: cannot touch '/root/file': Permission denied touch: cannot touch '/root/file': Permission denied
或者(也許是為了更好的可讀性)您可以將命令移動到腳本中。