我有一个脚本,每天早上 5 点在 Linux Ubuntu Server 上运行。此脚本通过以下方式备份我的所有 SVN:
#!/bin/bash
svnadmin dump /home/xxx/svn/p1 > /home/xxx/svn-backup/p1
svnadmin dump /home/xxx/svn/p2 > /home/xxx/svn-backup/p2
svnadmin dump /home/xxx/svn/p3 > /home/xxx/svn-backup/p3
问题是只有第一个项目 (p1) 被真正转储。其余项目都是包含以下文本的文件:
SVN-fs-转储格式版本: 2
UUID:895acea3-fcd0-46fa-908a-4b43fc3278af
修订编号:0 Prop-内容长度:56 内容长度:56
K 8 svn:date V 27 2009-11-12T15:25:00.461875Z PROPS-END
(编辑)从命令行运行脚本时,它会备份所有存储库,并且仅从 cron 运行时才会出现此问题。
这是为什么?
答案1
也许这是一个愚蠢的问题,但是存储库p2
是否p3
有任何已提交的内容/修订?很明显它们是存储库,否则您将收到错误消息而不是输出。但是,当我创建一个空存储库并svnadmin dump
在其上运行它时,我得到了与您描述的行为完全相同的行为。尝试检出存储库的副本并运行svn log
以查看是否有任何已提交的修订。同样,也许这是一个愚蠢的问题,但很容易检查。
答案2
我找到了解决方案。问题与 cron 作业的输出缓冲有关,并且 cron 在达到某个限制时会停止脚本。为了解决这个问题,我做了两件事:
在 cron 中我将输出重定向到 /dev/null
0 5 * * * /home/xxx/svn-backup/run-backup > /dev/null
在运行备份脚本中,我将输出重定向到 /dev/null
#!/bin/bash svnadmin dump /home/xxx/svn/p1 > /home/xxx/svn-backup/p1 2>/dev/null svnadmin dump /home/xxx/svn/p2 > /home/xxx/svn-backup/p2 2>/dev/null svnadmin dump /home/xxx/svn/p3 > /home/xxx/svn-backup/p3 2>/dev/null
这使得我的脚本可以运行!
更新:这实际上也在 stackoverflow 上进行了解释 -https://stackoverflow.com/questions/2323933/crontab-doesnt-finish-svndump
一旦 stderr 输出缓冲区达到一定限制,cron 似乎就会终止执行。