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 发送到电子邮件而不是“另一个文件”。
我的经验(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”的“回显行”会发送到电子邮件;标准输出会发送到日志),但我发现这比我最初想象的解决方案更好,因为电子邮件找到了我,我不必去日志文件中寻找问题。