我有一个小的bash脚本来备份一些MySQL数据库。该脚本使用mysqldump从MySQL转储出数据库,而不是将zipl转储到局域网上的另一台服务器。
当我直接从命令行运行脚本时,执行时间大约为2-3分钟。
我将相同的bash脚本添加到用户root的crontab中。这个cronjob每天执行三次。我的印象是,脚本的执行需要更长的时间(我猜是长达一个小时)。
有什么方法可以调试幕后发生的事情?我想找出执行需要花费更多时间的原因。
crontab条目如下所示:
* 0,8,16 * * * /opt/maintenance/backup-databases.sh
答案 0 :(得分:3)
创建一个名为wrap.sh的包装脚本,在其中放入以下行并在crontab中调用wrap.sh。如果将STDOUT / STDERR抛出到文件中以查找任何输出/错误,则不会受到影响。 您可以使用时间戳记作为日志文件名。此外,在主备份脚本.sh中,您可以提供一些echo语句来查看正在发生的事情,即当您打开日志文件时,它会显示您的回显消息,这些消息将显示过时的备份操作和时间命令输出最后显示完成整个wrap.sh脚本(调用备份脚本......)所花费的时间。
#!/bin/bash
DATE="$(date +"%m%d%Y%H%M%S")";
time /opt/maintenance/backup-databases.sh > /some/directory/${DATE}.wrap.log 2>&1
如果备份脚本是这样的(请注意,这里我们使用的是实际日期命令而不是DATE变量)。
a
# then do someone like
echo $(date +"%m%d%Y%H%M%S") -- step A: completed.
b
echo $(date +"%m%d%Y%H%M%S") -- step B: completed.
c
echo $(date +"%m%d%Y%H%M%S") -- step C: completed.
d
如果你只是寻找调试:然后执行以下操作(bash -x或sh -x或ksh -x等,如下所示):
#!/bin/bash
DATE="$(date +"%m%d%Y%H%M%S")";
time bash -x /opt/maintenance/backup-databases.sh > /some/directory/${DATE}.wrap.log 2>&1
答案 1 :(得分:3)
如果上面给出的crontab语法是您实际使用的语法,那么您的cronjob不会每天执行三次,而是每天12分钟,每天早上8点和下午4点执行。导致在给定时间内执行60次。因此,根据脚本,它可能会运行一个小时。
如果脚本运行2-3分钟,如果在这段时间内使用ps命令,则应该并行看到2-3个任务。您可能还想调查syslog。每个命令都应该有一个日志条目crond每分钟都会启动。
添加你的cronjob应该开始解决这个问题的小时(例如,如果你希望你的cronjob在12点的第12分钟和每天的早上8点和下午4点运行,则为12分钟):
12 0,8,16 * * * /opt/maintenance/backup-databases.sh
答案 2 :(得分:1)
您可以随时使用
计算脚本time /opt/maintenance/backup-databases.sh 2>&1 | egrep real
或在shell脚本中输入包含一些信息的日志文件。