Cron

cron:將錯誤發送到 syslog,而不是 MTA

  • June 6, 2020

我的桌面上沒有MTA安裝。

每當cronjob腳本出現問題時,我都會在日誌中看到:

CRON:  (CRON) info (No MTA installed, discarding output)

一個應該執行的腳本cron生成了一個錯誤,並cron希望通過電子郵件將錯誤發送給我。

但我想在我的日誌中看到錯誤,即正常記錄到syslog,與上述info消息相同。

是否可以告訴cron忘記MTA並將所有內容(包括錯誤)記錄到本地syslog

更新

如前所述,@roaima 的解決方案適用於我原來的問題。但是我已經意識到我需要更複雜的語法來為我的cronjobstdout從哪里通過command1管道傳輸到command2stderr(從兩者?)通過管道傳輸到command3.

這是一個具體的例子(簡化):

0 * * * * mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" | logger -t mysqldump -p cron.err

在上面的範例中,我需要從 to 發送標準輸出mysqldumpifne xz並且只有當其中一個mysqldumpifne xz生成錯誤時,我才需要將其通過管道傳輸到記錄器。

此語法需要在dash( /bin/sh)中工作

您可以使用記錄器子系統。有兩種變體,取決於您是否已systemd安裝。

  1. systemd- 使用systemd-cat
echo This is a test with systemd-cat | systemd-cat -t mytest -p info

這會將一條消息寫入日誌記錄器(請參閱 參考資料journalctl)並通過遺留系統日誌記錄子系統,您可以在其中找到輸出/var/log/syslog等。

journalctl -t mytest
-- Logs begin at Thu 2020-05-21 07:41:00 UTC, end at Mon 2020-06-01 13:34:56 UTC. --
Jun 01 13:34:56 pi mytest[24236]: This is a test through systemd-cat
  1. syslog- 使用logger
echo This is a test with logger | logger -t mytest -p local0.info

這會通過 syslog 子系統(參見或類似內容)寫入一條消息rsyslog.conf,您可以在其中找到輸出/var/log/syslog等。

tail /var/log/syslog
[...]
Jun  1 13:34:56 pi mytest[24236]: This is a test through systemd-cat
Jun  1 13:38:28 pi mytest: This is a test through logger

要使用這些日誌記錄選項之一,只需附加到您的cron作業,在範例中調整標籤名稱 ( myscript) 和優先級 ( info)

0 * * * * /path/to/script 2>&1 | systemd-cat -t myscript -p info

現在您已經提供了一個具體範例,您希望將stdout寫入目標數據文件但您想記錄stderr,您可以使用它

0 * * * * ( mysqldump mydb | ifne xz > "/tmp/$(date +\%F).sql.xz" ) 2>&1 | logger -t mysqldump -p cron.err

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