Tar error:通过Cron / PHP

时间:2015-08-17 14:09:13

标签: php cron tar

我有一个通过cron调用的PHP控制台脚本,它本身会创建一个目录的tar文件。

通过cron调用PHP脚本时,无法正确创建tar文件。查看tar文件时会出现以下错误:

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

通过控制台手动调用PHP脚本时,正确创建了tar文件。 cron日志输出显示没有错误。

这里tar调用形成PHP脚本。

 exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents");

任何人都知道为什么在手动调用时正确创建tar并在通过cron调用时失败?

更新:通过cron创建tar文件时给出的错误是:

tar: ../../backup/20150819-060003.tar.gz: Wrote only 4096 of 10240 bytes
tar: Error is not recoverable: exiting now

有时错误是:

tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now

如前所述,当通过cron执行时,tar文件被创建,但总是50%的正确大小(当手动执行脚本时):

-rw-r--r--  1 gtz gtz 1596099468 Aug 19 06:25 20150819-042330.tar.gz <- Manually called skript, working tar
-rw-r--r--  1 gtz gtz  858570752 Aug 19 07:21 20150819-052002.tar.gz <- Script called via cron, broken tar

更新2

根据此处给出的输入做了一些进一步的研究之后,可能应该补充一点,称为脚本的cron正在虚拟专用服务器上运行 - 我怀疑对于未由托管商记录的cron作业可能存在一些限制(仅限最低重复时间的限制在文档中给出。

7 个答案:

答案 0 :(得分:1)

该错误通常来自磁盘空间不足。

我会通过在tar执行之前和之后添加一些日志来进一步研究这个主题。

还要检查您的配置用于运行备份的cron作业的用户。它也可能是该用户的一些配额限制,当您在cron外部的控制台上运行时,这种情况不会发生。

向您的服务提供商询问VPS对用户和流程的配额限制......这就是响铃的原因。

答案 1 :(得分:0)

cronjobs本身通常没有限制。如果您使用共享主机,他们可能已安装了一些强制执行脚本,但我怀疑它们也会破坏您的控制台备份。

如果您从某个容器运行cronjobs,例如Drupal,他们有特殊的限制。

同时检查bash限制: ulimit -a

在备份开始之前和之后报告磁盘空间以防万一。它在VPS上通常很小。

答案 2 :(得分:0)

您可能希望尝试直接从PHP创建tarball以避免exec调用。请参阅此答案:https://stackoverflow.com/a/20062628/5260945

另外,查看您的cron条目,您的示例中没有前导斜杠。我知道这可能只是评论的拼写错误,但请确保您有cd命令的绝对路径。 cron作业的默认环境与登录shell的默认环境不同。

答案 3 :(得分:0)

我确定它的内存或执行时间问题。 对于仅包含单个测试文件的目录运行相同的脚本并检查输出,如果您的脚本在此方案中工作,则100%确定其内存问题。

尝试调整内存参数并执行脚本。

我希望这对你有所帮助。

由于

答案 4 :(得分:0)

查看以下错误。

tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now

我看到,因为PHP脚本中的exec函数没有阻塞或过早地导致错误。因此,在命令完成之前,在Cron作业期间调用的PHP会话将退出。这只是猜测,但是当您从Cron运行它时,您可以尝试将其发送到后台。

exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents &");

这个命令应该是阻塞所以这只是在黑暗中拍摄。

http://php.net/manual/en/function.exec.php

答案 5 :(得分:-3)

当您尝试执行php文件并出现EOF错误时发生错误。它意味着你的php文件中的某个地方你必须检查你的cron文件的代码,你可能会忘记完成条件或类等的括号......

祝你好运[&#39;}

答案 6 :(得分:-3)

通过cron行执行cron替换>/paht/to/application/app/logs/backup-output.log时,将错误写入日志2>&1 >/path/to/application/app/logs/backup-output.log 还要检查cron行中的路径..也许change-dir无法正常工作。在从cron运行php脚本时,尝试将getcwd()打印到日志或其他内容。

编辑:我想知道为什么这被投票not useful。提问者提到当cron执行脚本时,没有错误打印到日志中。这不难想象,因为>只是将STDOUT重定向到日志而不是STDERR(将错误打印出来的php)。因此,添加2>&1可能会显示一些新信息。