私が持っている小さなスクリプトでは、シェルを起動してから、 prlimit を使用して、シェルのRLIMIT_NPROCを5などの小さな数値に設定しています。
次に、以下のみを含むシェルスクリプトを実行しようとします。
#!/bin/bash
echo hi
sleep 3
stdinを介して「./test.sh\n」を送信し、結果を待ちます。同時に、ps --ppid <somepid> -o pid=
を使用して最初の子PIDを一覧表示しています。
これは常にエラーbash: fork: retry: No child processes
で失敗します。制限をRLIM_INFINITYに設定して、作成される子プロセスの数を確認しようとしましたが、リストされているのは1つだけです(当然、シェル処理test.sh)。
子プロセスの数を適切に制限するには(または、より一般的には、ある種のフォーク爆弾を制限するには)どうすればよいですか?私はcgroupや他の同様の代替手段について知っていますが、学習するためにこれを書き込もうとしています。この動作は本当に私を混乱させます。
RLIMIT_NPROCのドキュメントに、「プロセスの最大数(より正確には、Linuxではスレッド)」と作成されるスレッドの数が制限されていることが原因である可能性がありますが、プログラムはRLIMIT_NPROCを500まで増やした場合にのみ機能します。かそこら、そしてそれはあまり合理的ではないようです。
この動作が予期しないものである場合は、コーディングエラーである可能性があります。その場合は、ここに投稿するテストコードをクリーンアップしようとします。
RLIMIT_NPROCは、プロセスが持つことができる子の数を制御しません。
serが持つことができるプロセスの総数を制御します。より具体的には、プロセスごとの設定であるため、fork()、clone()、vfork()などがプロセスによって呼び出されると、そのプロセスのRLIMIT_NPROC値がtotalプロセスと比較されます。そのプロセスの親のカウントser、プロセスが持つ子の数ではありません。
getrlimit(2)
のマニュアルページは、実際のユーザーとして実行できるスレッド(ここでは関係ありません)の数を制限すると言っていると理解しています。
あなたが何をしているのかよくわかりませんので、ご容赦ください。リストしたスクリプトを受け取るプログラムを開始し、それを子として実行します。その間、ps
を実行してPIDをチェックしますか?
ユーザーが実行しているシェルは確かに1つであり、プログラムがスクリプトを起動し、次にスクリプトが実行され、psが5を作成します。psが独自の内部目的でスレッドを起動しようとすると、制限のために失敗します。 5プロセスまで。
あなたが説明することは、何かをする方法を見るためのある種の実験のように見えます。あなたは本当にどんな問題を解決しようとしていますか?それが何であるかを知らなければ、私たちがより良い代替案を提案する(またはあなたが望むことをする方法をあなたに教える)方法は本当にありません。