记录整个 && 命令链的错误(在 Cron 作业中)

记录整个 && 命令链的错误(在 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,并包含具体原因?

答案1

您可以将链包装在子 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

或者(也许是为了更好的可读性)您可以将命令移动到脚本中。

相关内容