存档日志的Unix脚本 - 即使一个命令失败也执行所有命令

时间:2016-03-27 09:24:33

标签: shell unix ssh

目标: Unix脚本应存档超过2天的日志。

问题:如果归档或移动文件时没有文件,则应执行整个脚本。

脚本文件内容: archivelogs.sh

find /logs/tomcat/*.* -type f -name "*.*" -mtime +2 -print -exec gzip {} \;
find /logs/tomcat/*.gz -exec mv -f '{}' /logs/tomcat/logsbkp/ \;
find /logs/jboss/*.* -type f -name "*.*" -mtime +2 -print -exec gzip {} \;
find /logs/jboss/*.gz -exec mv -f '{}' /logs/tomcat/logsbkp/ \;

解决方案: 请建议即使上述命令失败,我如何能够执行所有执行的命令。

注意: 我的crontab每天都会在凌晨12:00运行。

2 个答案:

答案 0 :(得分:1)

我建议在将这些命令添加到crontab时,请在日志文件中捕获上述命令的输出。然后grep错误或日志文件中的一些字符串来获取错误,如果日志文件中有错误,请使用mailx在邮件中发送错误。创建一个crontab作业来执行此操作并在完成所有存档作业后安排它。

答案 1 :(得分:0)

一个简单的解决方案是在您的脚本中添加此行。

#!/bin/sh +e

set +e

您可以使用

撤消它
set -e

set -e选项

  

如果管道可能包含一个简单的命令,列表,则立即退出   或复合命令返回非零值   状态。如果失败的命令是shell的一部分,则shell不会退出   紧跟一段时间或直到关键字的命令列表,部分   if语句中的测试,是&&amp ;;中执行的任何命令的一部分。   或||列表除了最后一个&&之后的命令或者||,任何   管道中的命令但是最后一个,或者命令的返回状态   正在被倒置!如果是子shell以外的复合命令   返回非零状态,因为命令在-e存在时失败   忽略,shell不退出。 ERR上的陷阱(如果已设置)将被执行   在shell退出之前。

     

此选项分别适用于shell环境和每个子shell环境   导致子shell退出之前执行所有命令   子外壳。

     

如果复合命令或shell函数在忽略-e的上下文中执行,则不会执行任何命令   复合命令或函数体将受-e设置的影响,   即使设置了-e并且命令返回失败状态。如果一个   复合命令或shell函数在-a中执行时设置-e   上下文中-e被忽略,该设置不会产生任何影响   直到复合命令或包含函数调用的命令   完成。

相关问题