私はいくつかの cronjob の問題をトラブルシューティングしようとしているので、それらのログ記録を開始したいと考えました。
* * * * * wget https://www.example.com/dosomething.php >> /var/log/myjob.log 2>&1
ログ ファイルを表示すると、デバイスに空き容量がないというエラーが表示されますが、cron ジョブは正常に実行されます。
df と df -i を実行してストレージと inode を確認しましたが、十分なストレージ容量があります。
この「デバイスに空き容量がありません」というエラーがログに記録される原因は何ですか?
--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
私はあなたを疑っているスクリプトが実行されるたびに新しいファイルが保存されましたリソース制限に達した他のファイルコンテンツの合計サイズよりも大きい。
inodeの使用状況を調べてみてくださいdf -i
。多くのファイルシステムは、ファイルの合計容量だけでなく、コンテンツ、それだけでなく、名前、所有者、時間、権限などを保存するために必要なファイル メタデータ エントリもあります。100 万個の inode がある場合、それは一般的なオペレーティング システムの使用量をはるかに超えることになります。
このようなコマンドは不特定の時間ハングする可能性がありますが、可能性のあるディレクトリを直接チェックして、9621811 つのディレクトリに空のファイルが存在する。一部のファイルシステムでは、1 つのディレクトリ レベル以下の個々のエントリの数に追加の制限が課せられます。これは望ましくないことですが、多数のファイルが必要なアプリケーションでは、高速 (マルチレベル インデックス) アクセスの方が適しています。
見つかったファイルの数が多すぎる場合はどうすればいいですか?
潜在的な出力を保持したいが、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