簡體   English   中英

Tar error:通過Cron / PHP運行時存檔中的意外EOF

[英]Tar error: Unexpected EOF in archive when running via Cron/PHP

我有一個通過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

在根據此處給出的輸入做了一些進一步的研究之后,可能應該補充一個名為script的cron正在虛擬專用服務器上運行 - 我懷疑對於沒有托管者記錄的cron作業可能存在一些限制(僅限於最低限度)重復時間在文檔中給出。

該錯誤通常來自磁盤空間不足。

我會在tar執行之前和之后添加一些日志,對這個主題做更多的研究。

還要檢查您的配置用於運行備份的cron作業的用戶。 它也可能是該用戶的一些配額限制,當您在cron外部的控制台上運行時不會發生這種限制。

向您的提供商詢問VPS對用戶和流程的配額限制......這就是響鈴。

我猜你有資源限制正如M. Ivanov所說,在你的PHP腳本中添加這個命令:

shell_exec("php -info");

從命令行和cron作業執行腳本時檢查此參數

memory_limit => ???

您還可以通過將內存限制增加到1600M來嘗試運行您的cron

php -d memory_limit=1600M scriptCompressor.php

希望有幫助:)

cronjobs本身通常沒有限制。 如果您使用共享主機,他們可能已安裝了一些強制執行腳本,但我懷疑它們也會破壞您的控制台備份。

如果你從某個容器運行cronjobs,例如Drupal,它們有特殊限制。

還要檢查bash限制: ulimit -a

在備份開始之前和之后報告磁盤空間以防萬一。 它在VPS上通常很小。

您可能想嘗試直接從PHP創建tarball以避免exec調用。 請參閱此答案: https//stackoverflow.com/a/20062628/5260945

另外,查看您的cron條目,您的示例中沒有前導斜杠。 我知道這可能只是評論的錯字,但要確保你有一個cd命令的絕對路徑。 cron作業的默認環境與登錄shell的默認環境不同。

我確定它的內存或執行時間問題。 對於僅包含單個測試文件的目錄運行相同的腳本並檢查輸出,如果您的腳本在此方案中工作,則100%確定其內存問題。

嘗試調整內存參數並執行腳本。

我希望這對你有幫助。

謝謝

看下面的錯誤。

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

當您嘗試執行php文件並出現EOF錯誤時發生錯誤。 它意味着你的php文件中的某個地方你必須檢查你的cron文件的代碼,你可能會忘記完成條件或類等的括號...

祝好運 ['}

通過cron替換>/paht/to/application/app/logs/backup-output.log cron行中的>/paht/to/application/app/logs/backup-output.log並通過2>&1 >/path/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可能會顯示一些新信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM