我正在嘗試解決我遇到的一些 cronjob 問題,所以我想開始記錄它們。
* * * * * wget https://www.example.com/dosomething.php >> /var/log/myjob.log 2>&1
當我查看日誌檔案時,我收到一些 No space left of device 錯誤,但 cronjob 成功運行。
我檢查了 df 和 df -i 以檢查我的儲存和索引節點,我有足夠的儲存空間。
記錄時,是什麼導致了此特定的“設備上沒有剩餘空間”錯誤?
--2022-12-09 19:32:08-- https://www.example.com/dosomething.php
Resolving www.example.com (www.example.com)... x.x.x.x
Connecting to www.example.com (www.example.com)|x.x.x.x|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
dosomething.php.962181: No space left on device
Cannot write to 'dosomething.php.962181' (Success).
答案1
我懷疑你每次執行該腳本時都會儲存一個新文件並達到一些資源限制其他比文件內容總大小。
嘗試df -i
尋找 inode 使用情況。許多檔案系統不僅對檔案總量施加限制內容,但此外還有儲存名稱、所有者、時間、權限所需的檔案元資料條目。
此類命令可能會掛起一段未指定的時間,但您可以嘗試直接檢查可能的目錄以確定是否有962181一個目錄中的空文件。某些檔案系統會對單一目錄層級下的單一條目的數量施加額外的限制。這不太可能是您想要的,任何需要許多文件的應用程式也可以透過快速(多層索引)存取得到更好的服務。
發現文件過多如何處理?
如果您想保留潛在的輸出,但不需要儲存 cronjob 之前運行的時間,您可能需要選擇性地刪除空文件並僅繼續調查非空文件的內容,例如:
# find /root -xdev -maxdepth 1 -type f -size 0 -name "dosomething.php.*" -delete
如何阻止問題在未來再次發生?
如果您實際上不需要保留所有先前下載的結果,請考慮在每次呼叫時指定要覆蓋的輸出名稱(甚至可能是 /dev/null,甚至不儲存最新的下載),而不是預設的捲曲當目錄中已存在時,只需將一個數字附加到輸出檔名。
* * * * * wget -O /root/latest-something.html https://example.com/something.php >> /var/log/myjob.log 2>&1