[英]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 &");
這個命令應該是阻塞的,所以這只是在黑暗中拍攝。
當您嘗試執行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.