Bash

如何將輸出從 cron 中重定向到文件?

  • November 10, 2021

我有一個備份腳本,我需要在一天中的特定時間執行,所以我正在使用cron這個任務,並且在 cron 中我還試圖將備份腳本的輸出重定向到logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

在上面的 cron 條目中,我將兩者都重定向stderr and stdout到一個日誌文件。

上面的 cron 作業執行良好syslog ,它執行文件中提到的任務,backup.sh但它沒有向日誌文件寫入任何內容。

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

當我從 cli 執行腳本時,它會按要求工作,並將輸出寫入日誌文件

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

那麼,為什麼文件的輸出沒有從 cron 中重定向到文件。

我解決了這個問題。有兩種方法:

M1

將重定向從 更改&>>2>&1。所以現在crontab -e看起來像

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

我相信上述方法是有效的,因為預設情況下cron是使用sh來執行任務,而不是bash因此&>>不受sh.

M2

通過添加文件SHELL=/bin/bash來更改預設外殼。crontab -e

免責聲明

$$ 1 $$. 我想在@RanRag 的回答中添加腳註或附錄。

確保您的 shell 重定向語法符合/bin/sh. 如果您嘗試使用無效的 shell 重定向語法,/bin/sh那麼您的命令將失敗並且您的 cron 作業將永遠不會執行。

在您的/etc/cron.d/example1配置文件中,如果您指定了一個使用者以外的使用者root並且該使用者的登錄 shell 不是……您仍然必須在命令/bin/bash中使用 /bin/sh 語法。/etc/cron.d/example1


例如

如果您的使用者有 shellcshzshksh他的登錄 shell 設置。在您的/etc/cron.d/example1配置文件中,該命令必須使用/bin/sh語法。具體來說,任何 shell 重定向都必須是/bin/sh語法。

如果您嘗試在 中使案例如cshshell 重定向語法/etc/cron.d/example1,那麼您的 cron 作業將永遠不會執行。crond位於 at的日誌文件/var/log/cron應說明該命令已執行,但在您的命令執行之前該命令將出錯並出現語法錯誤。

語法錯誤在哪裡crond發出錯誤消息?

該錯誤從未在/var/log/cron. crond相反,預設情況下使用 . 發出任何錯誤消息mail。所以你必須檢查/var/spool/mail/${USER}看看是什麼錯誤。

$$ 1 $$ 免責聲明

  • 這個答案假設一個sysv系統

  • systemd資訊可能不同

  • 具體來說,此資訊是針對centos-6發行版學習的,可能不適用於不同的sysv發行版

    • 我特別提到centos-6,因為不同的發行版可能有不同的crond實現,不同於centos-6

引用自:https://unix.stackexchange.com/questions/52330