pdftoppm
を実行しています ユーザー提供のPDFを300DPI画像に変換します。これは、ユーザーが非常に大きなページサイズのPDFを提供する場合を除いて、うまく機能します。 pdftoppm
そのサイズの300DPI画像をメモリに保持するのに十分なメモリを割り当てます。100インチ四方のページの場合、100 * 300 * 100 * 300*4バイト/ピクセル=3.5GBです。悪意のあるユーザーが私にばかげた大きなPDFを渡して、あらゆる種類の問題を引き起こす可能性があります。
ですから、私がやりたいのは、実行しようとしている子プロセスのメモリ使用量にある種の厳しい制限を設けることです。たとえば、500 MBを超えるメモリを割り当てようとした場合は、プロセスを停止させます。それは可能ですか?
これにulimitを使用できるとは思いませんが、1つのプロセスに相当するものはありますか?
承認された回答:
ulimitにはいくつかの問題があります。このトピックに関する有用な読み物は次のとおりです。Linuxでのプログラムの時間とメモリ消費の制限。これにより、タイムアウトツールが使用され、時間またはメモリ消費によってプロセス(およびそのフォーク)をケージに入れることができます。
タイムアウトツールには、Perl5以降と/proc
が必要です。 ファイルシステムがマウントされました。その後、ツールをコピーします。 /usr/local/bin
そのように:
curl https://raw.githubusercontent.com/pshved/timeout/master/timeout |
sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout
その後、次のように質問のように、メモリ消費によってプロセスを「ケージ」に入れることができます。
timeout -m 500 pdftoppm Sample.pdf
または、-t <seconds>
を使用することもできます および-x <hertz>
時間またはCPUの制約によってそれぞれプロセスを制限します。
このツールが機能する方法は、生成されたプロセスが設定された境界をオーバーサブスクライブしていないかどうかを1秒間に複数回チェックすることです。これは、プロセスが潜在的に可能性がある小さなウィンドウが実際に存在することを意味します タイムアウトが通知されてプロセスが強制終了される前に、オーバーサブスクライブする必要があります。
したがって、より正確なアプローチにはcgroupが含まれる可能性がありますが、DockerまたはrunCを使用する場合でも、cgroupの周りでよりユーザーフレンドリーな抽象化を提供するため、セットアップにははるかに複雑です。