在.sh脚本中记录/查找错误

时间:2016-09-12 05:45:12

标签: logging sh error-logging

我有基本的.sh脚本来进行夜间备份。整个代码是:

#!/bin/bash

DATE=`date +%Y%m%d`

tar czfP /var/www/backup/$DATE.tar.gz `find /var/www/web -type d | grep -E '/var/www/web/web[0-9]+/web' | grep -v 'web1'`

这使得我所有网站的$DATE.tar.gz文件排除" web1"。它工作正常,直到今天。

当我在控制台中手动执行此脚本(不使用cron)时,我会看到任何警告("No such file or directory",通常是当dirname / filename在名称中有空格时)。没关系,我无能为力,客户自己创建文件。我认为这些文件没有备份。

但是今天,脚本运行以1/3结束,错误消息为Exiting with failure status due to previous errors。我不知道剧本在哪里发生故障,所以......

有没有办法写"路径/文件名"最后一个错误文件(导致"Exiting with failure status due to previous errors")进入日志?如果可能,我们可以排除"没有这样的文件或目录"错误,他们将每天在那里,没有机会修复文件名。

由于

PS:
我读过这条错误信息可能是由无效的用户权限引起的。如果是这样,我可以检查权限,但我需要知道脚本失败的位置。到目前为止它确实正常工作,3年前cca,所有文件都是由CMS(同一个www用户)创建的,没有任何手动上传。

1 个答案:

答案 0 :(得分:0)

来自find的输出由shell标记化,这意味着其中包含空格的任何文件名将被分解为多个部分(多个表观文件名,其中没有一个可能存在)。基本上,不要使用反引号(或更一般地command substitutions),其中输出是文件名列表。

根据您的具体要求,解决方法可能非常简单。

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web

web0web2归档到web9。如果这就是您所需要的,那么您已经完成了。您可以扩展到单位和双位而不会丢失易读性:

tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web /var/www/web/www[02-9][0-9]/web

等(如果你的shell是Bash,这可以用大括号缩写)但是对于多个数字或更复杂的目录层次结构,可能这不是你真正想要的。

更一般地说,您可能想要探索GNU --exclude的{​​{1}}选项。

更一般地说,如果你有GNU tar,你可以使它产生输出,其中路径名由空字节而不是换行符分隔。这使得输出明确(null是唯一一个永远不会出现在文件名中的字符)并且健壮。

find

find /var/www/web/www[0-9]/web -type d -path web1/web -prune -o -print0 | xargs -r0 tar czfP /var/www/backup/"$DATE".tar.gz 选项和相应的-print0选项是GNU扩展。没有它们,几乎不可能强有力地处理任意文件名,所以我建议你安装GNU版本,如果你被困在一个没有开箱即用的架构上。

至于捕获xargs -0错误,我建议您将错误输出重定向到文件,以便您可以随意查看。