目标: 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运行。
答案 0 :(得分:1)
我建议在将这些命令添加到crontab时,请在日志文件中捕获上述命令的输出。然后grep错误或日志文件中的一些字符串来获取错误,如果日志文件中有错误,请使用mailx在邮件中发送错误。创建一个crontab作业来执行此操作并在完成所有存档作业后安排它。
答案 1 :(得分:0)
一个简单的解决方案是在您的脚本中添加此行。
#!/bin/sh +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被忽略,该设置不会产生任何影响 直到复合命令或包含函数调用的命令 完成。