2010-02-24 54 views
2

我刚刚发现我创建的SVN仓库的自动转储已经越早被切断,基本上只有一半转储在那里。这不是紧急情况,但我讨厌在这种情况下。它首先打破了自动备份的目的。CRONTAB没有完成svndump

我正在使用的命令如下。如果我在终端上手动执行它,它会很好地完成; output.txt文件大小为16 megs,全部335个修订版本。但如果我把它留给crontab,它会在中途退出,大约8.1 megs,只有前169个版本。

# m h dom mon dow command 
18 00 * * * svnadmin dump /var/svn/repos/myproject > /home/andrew/output.txt 

我实际上保存到一个过时的gzip文件,并且服务器上没有空间不足,所以这不是磁盘空间问题。它似乎在两秒钟后保释,所以这可能是一个时间问题,但文件大小在过去一个月每次都是相同的,所以我不认为它是这样。 crontab是否在有限的内存空间内执行?

回答

5

所以,我不知道这里真正的问题是什么,但是如果我在执行转储时将svnadmin的STDERR路由到/ dev/null,则一切顺利。我尝试使用“安静”标志(-q),它也成功。我假设当从crontab运行的shell脚本在STRERR中遇到足够的文本时,它会停止正在运行的任何内容的执行并转到下一条指令。我已经在手动文件和预定文件上完成了MD5,它们是相同的。这似乎已经解决了。所以如果有人自己遇到这个问题,这是我用来成功通过早期截断的shell脚本。这有点冗长。抱歉。

#!/bin/sh 
echo "STARTING AT $(date +\%Y/\%m/\%d/T%I:\%M:\%S)" >> /home/andrew/svnlog.txt 
rm /tmp/andrewMobileApp.dump 
svnadmin dump /var/svn/repos/andrewMobileApp > /tmp/andrewMobileApp.dump 2>/dev/null 
echo "svnadmin exited with code $?" >> /home/andrew/svnlog.txt 
gzip -c /tmp/andrewMobileApp.dump > "/home/andrew/svnbackups/andrewMobileApp.dump.$(date +\%Y\%m\%d\%I\%M\%S).txt.gz" 
echo "gzip exited with code $?" >> /home/andrew/svnlog.txt 
echo "DONE AT $(date +\%Y/\%m/\%d/T%I:\%M:\%S)" >> /home/andrew/svnlog.txt 
echo "-----" >> /home/andrew/svnlog.txt 

该脚本通过超级用户crontab调用。

0

你对用户目录有大小限制吗?可能要先尝试将其转储到临时文件中。

+0

我不认为尺寸限制是一个因素。虽然该文件在中途切断,但该目录有20个完全相同大小的完全相同的备份。我试着倾倒到/ tmp,并在同一时刻切断。 crontab也在超级用户级别执行,所以它应该可以非常自由地访问文件系统。 – Andrew 2010-02-24 06:17:14

+0

另一个想法: - 尝试将svnadmin调用包装为shell scrtip。在调用svnadmin之前和之后添加日期/时间戳。将输出重定向到某个日志文件。还要记录svnadmin结果代码。这会给你一些关于svnadmin呼叫的成功和它需要多长时间的想法。 - 尝试重新安排这个任务到不同的时间(我有一些疯狂的cron错误与特定的执行日期和时间相关联)。 – sha 2010-02-26 04:28:32

+0

果然,当我在shell脚本中捕获返回代码时,当我sudo手动执行它时,svnadmin dump会返回“0”,但当它执行crontab时,它返回“1”。我还记录了/ usr/bin/id,这些信息对我和crontab都是一样的。该脚本正在相同的用户上下文中运行。 必须有一些crontab配置值,我没有在这里看到。这对我来说没有任何意义。我会继续挖掘。 – Andrew 2010-02-27 04:51:55

1

首先,确保svnadmin位于cron作业的PATH环境变量上。您可能必须指定/usr/bin/svnadmin或其他适当的完整路径。

此外,您可能需要查看svnadmin hotcopy,而不是svnadmin dump,这是一个用于备份存储库的工具。

+0

我尝试添加绝对路径,但没有区别。 svnadmin _is_执行,它似乎并没有完成。我想避免使用hotcopy,因为它不够便携。我可以(可能)获取存储库的转储,并在发生硬件故障时使用它创建服务器的夜间快照。那么,无论如何,这是主意。 – Andrew 2010-02-24 06:20:00

+0

尝试将命令的标准错误捕获到文件中,以便查看它是否报告错误。 – Avi 2010-02-24 06:29:14

+0

我没有看到任何例外或错误。我打开了cron系统日志记录,它似乎正常执行: Feb 24 01:12:01 desktop/USR/SBIN/CRON [25399] :(根)CMD(/ usr/bin/svnadmin dump/var/svn/repos/myproject> /home/andrew/output.txt) 我也尝试在语句的末尾添加一个'&'来查看分支是否允许它执行更多的时间。不知道这是否在crontab中有意义,但它没有效果。 – Andrew 2010-02-24 08:20:34

1

我在Debian cron包中提交了这个bug,因为我在那里也遇到了它(在vserver下)。查看Debian中的错误#577133。 Christian Kastner通过添加代码来绕过所有邮件处理代码(如果未找到MTA),修补了该错误。