Cron 作业 stderr 到电子邮件和日志文件?

Ste*_*eph 5 unix cron redirect

我有一个 cron 工作:

$SP_s/StartDailyS1.sh >$LP_s/MirrorLogS1.txt
Run Code Online (Sandbox Code Playgroud)

其中SP_s是脚本的路径,LP_s是日志文件的路径。这会将 stdout 发送到日志文件,将 stderr 发送到我的电子邮件。

我该怎么办?:
1)将标准输出和标准错误发送到日志文件,
2)并将标准错误发送到电子邮件

或者换句话说:stderr 到日志文件和电子邮件,stdout 只到日志文件。

更新:到目前为止,我得到的答案都不符合我设定的标准,也不适合 CRON 工作。

我看到了这个,其目的是“将 STDOUT 和 STDERR 从命令发送到一个文件,然后将 STDERR 发送到另一个文件”(由 zazzybob 在 unix.com 上发布),这似乎接近我想要做的事情,我想知道这是否会激励比我更聪明的人:

(( my_command 3>&1 1>&2 2>&3 ) | tee error_only.log ) > all.log 2>&1 
Run Code Online (Sandbox Code Playgroud)

我希望 cron 将 STDERR 发送到电子邮件而不是“另一个文件”。

Ste*_*eph 0

我的经验(ubuntu)是“crontab”仅发送电子邮件“stderr”(我将输出定向到日志文件,然后将其存档)。这很有用,但我想要确认脚本已运行(即使“stderr”没有错误),以及有关花费多长时间的一些详细信息,我发现这是发现潜在问题的好方法。

我发现最容易解决这个问题的方法是编写脚本,其中包含一些重复的“echo”。大量的常规“回声”最终出现在日志文件中。对于我在 crontab“MAILTO”电子邮件中想要的重要非错误位,我使用了一个“echo”,它通过“1>&2”定向到 stderr。

因此:

    Frmt_s="+>>%y%m%d %H%M%S($HOSTNAME): " # =Format of timestamp: "<YYMMDD HHMMSS>(<machine name>): "
    echo `date "$Frmt_s"`"'$0' started." # '$0' is path & filename
    echo `date "$Frmt_s"`"'$0' started."  1>&2 # message to stderr

# REPORT:
    echo ""
    echo "================================================"
    echo "================================================" 1>&2 # message to stderr
    TotalMins_i=$(( TotalSecs_i / 60 )) # calculate elapsed mins
    RemainderSecs_i=$(( TotalSecs_i-(TotalMins_i*60) ))
    Title_s="TOTAL run time"
    Summary_s=$Summary_s$'\n'$(printf "%-20s%3s:%02d" "$Title_s" $TotalMins_i $RemainderSecs_i)
    echo "$Summary_s"
    echo "$Summary_s" 1>&2 # message to stderr
    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 1>&2 # message to stderr
    echo ""
    echo `date "$Frmt_s"`"TotalSecs_i: $TotalSecs_i"
    echo `date "$Frmt_s"`"'$0' concluded." # '$0' is path & filename
    echo `date "$Frmt_s"`"'$0' concluded."  1>&2 # message to stderr
Run Code Online (Sandbox Code Playgroud)

向我发送一封包含此内容的电子邮件(如果没有错误,则不会出现以“ssh:”和“rsync:”开头的行):

170408 030001(sb03): '/mnt/data1/LoSR/backup_losr_to_elwd.sh' started.
ssh: connect to host 000.000.000.000 port 0000: Connection timed out
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]
ssh: connect to host 000.000.000.000 port 0000: Connection timed out
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]
================================================
S6 SUMMARY (mins:secs):
'Templates'           2:07
'Clients'             2:08
'Backups'             0:10
'Homes'               0:02
'NetAppsS6'          10:19
'TemplatesNew'        0:01
'S6Www'               0:02
'Aabak'               4:44
'Aaldf'               0:01
'ateam.ldf'           0:01
'Aa50Ini'             0:02
'Aadmin50Ini'         0:01
'GenerateTemplates'   0:01
'BackupScripts'       0:01
TOTAL run time       19:40
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
170408 031941(sb03): '/mnt/data1/LoSR/backup_losr_to_elwd.sh' concluded.
Run Code Online (Sandbox Code Playgroud)

这并不能满足我最初的愿望“将标准输出和标准错误发送到日志文件”(标准错误,并且只有带有“1>&2”的“回显行”会发送到电子邮件;标准输出会发送到日志),但我发现这比我最初想象的解决方案更好,因为电子邮件找到了我,我不必去日志文件中寻找问题。