Bash脚本、检查错误、日志

Bash脚本、检查错误、日志,bash,shell,logging,scripting,Bash,Shell,Logging,Scripting,这里有一个是给巴什福巫师的。不,事实上,我只是开玩笑,你们可能都知道,除了我 我正在尝试创建一个备份shell脚本。这个想法相当简单:在某个文件夹中查找超过7天的文件,将它们tar/gzip到另一个目录,然后删除它们。问题是,我不确定我是否有足够的权限在目标目录中创建tar/gzip文件。是否有任何(正确的)方法来检查文件是否已成功创建,如果是,请删除文件。否则,请跳过该部分,不要销毁客户的数据。我听说他们不太喜欢那个 以下是我目前掌握的情况: 01: #!/bin/bash 02: 03:

这里有一个是给巴什福巫师的。不,事实上,我只是开玩笑,你们可能都知道,除了我

我正在尝试创建一个备份shell脚本。这个想法相当简单:在某个文件夹中查找超过7天的文件,将它们tar/gzip到另一个目录,然后删除它们。问题是,我不确定我是否有足够的权限在目标目录中创建tar/gzip文件。是否有任何(正确的)方法来检查文件是否已成功创建,如果是,请删除文件。否则,请跳过该部分,不要销毁客户的数据。我听说他们不太喜欢那个

以下是我目前掌握的情况:

01: #!/bin/bash
02: 
03: ROOTDIR="/data/www"
04: 
05: TAR="${ROOTDIR}/log/svg_out_xml/export_out_ack_$(date +%Y-%m-%d).tar"
06: cd ${ROOTDIR}/exchange/export/out_ack/
07: find . -mtime +7 -type f -print0 | xargs -0 tar -cf "${TAR}"
08: gzip ${TAR}
09: find . -mtime +7 -type f -print0 | xargs -0 rm -f
基本上,我需要检查第7行和第8行是否一切正常,如果是,执行第9行


此外,我还想为这些操作创建一个日志文件,这样我就知道一切都正常了(这是一个每晚的cron作业)。

简单的解决方法,但没有明确的错误消息,将
-e
添加到shebang,即
#/bin/sh-e
,如果命令失败,将导致shell退出

我想Cron应该会通过邮件给你一条错误消息

如果你想进行全面的备份计划,我建议你使用一些已经制作好的东西。有很多文件,大多数工作都很好。

GNU tar已经
——删除文件,一旦文件添加到存档中,这些文件将被删除
v
将使其在添加文件时列出文件
z
将在运行中通过gzip输送焦油


您的
find
解决方案是快速的;调用之间的文件可能符合条件,因此会被删除但不会备份。

对于日志记录,您可以将脚本的部分用大括号括起来,并将标准输出重定向到日志文件:

{
    script_command_1
    script_command_2
    script_command_3
} >> /path/to/log_file

对于日志记录,您可以将标准输出和/或标准错误上写入的所有输出安排到一个文件中。这样,您就不需要重定向每个命令的输出:

# Save standard output and standard error
exec 3>&1 4>&2
# Redirect standard output to a log file
exec 1>/tmp/stdout.log
# Redirect standard error to a log file
exec 2>/tmp/stderr.log

# Now the output of all commands goes to the log files
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2
...

# Print a message to the original standard output (e.g. terminal)
echo "This goes to the original stdout" 1>&3

# Restore original stdout/stderr
exec 1>&3 2>&4
# Close the unused descriptors
exec 3>&- 4>&-

# Now the output of all commands goes to the original standard output & error
...
要仅在前一个命令成功时执行命令,可以使用条件链接它们:

# Execute command2 only if command1 succeeds, and command3 only if both succeed:
command1 && command2 && command3

# Execute command2 only if command1 fails
command1 || command2
所以你可以做像这样的事情

{ find . -mtime +7 -type f -print0 | xargs -0 tar -cf "${TAR}" &&
  gzip ${TAR} && 
  find . -mtime +7 -type f -print0 | xargs -0 rm -f } || 
    { echo "Something failed" 1>&2; exit 1 }
或在日志输出中提供详细信息:

find . -mtime +7 -type f -print0 | xargs -0 tar -cf "${TAR}" || 
  { echo "find failed!!" 1>&2; exit 1 }
gzip ${TAR} || 
  { echo "gzip failed!!" 1>&2; exit 1 }
find . -mtime +7 -type f -print0 | xargs -0 rm -f || 
  { echo "cleanup failed!!" 1>&2; exit 1}

下面是所有的评论,使用一些预先准备好的安全的东西。从经验来看,递归?:)你的标签上写着“bash”,但你的shebang上写着“sh”。我接受了丹尼斯·威廉姆森的回答,因为他是唯一一个解决日志问题的人,但是所有的建议都非常有用,谢谢大家!很好的建议。我总是在脚本中使用
-e
。谢谢你的提示,非常有用!不幸的是,cron不会给我们发送任何东西,因为我们不是这个系统的管理员。如果您在crontab中定义MAILTO,那就太好了。@dr:如果您在crontab中定义MAILTO,那就太好了。请参阅关于
bash-e
。tl;dr-“不要使用
set-e
”感谢您的回答。调用之间不太可能有文件,因为此脚本将在凌晨4点运行,此时不应在我备份的文件夹中创建任何文件。当然,总有一个用户..Kewl,如果我这样写,我希望它能工作:
>${LOG}2>&1