私の小さなスクリプトはシェルを起動し、RLIMIT_NPROCを小さな数字(たとえば5)に設定します。限界
次に、次を含むシェルスクリプトを実行しようとします。
#!/bin/bash
echo hi
sleep 3
標準入力で「./test.sh\n」を送信し、結果を待ちます。また、ps --ppid <somepid> -o pid=
最初のPIDの下位PIDを一覧表示しました。
これは常にエラーで失敗しますbash: fork: retry: No child processes
。どのくらいの子プロセスが作成されたかを確認するために制限をRLIM_INFINITYに設定しようとしましたが、1つだけがリストされています(自然にtest.shを処理するシェル)。
サブプロセスの数を適切に制限する方法(またはより一般的には一種のフォーク爆弾を制限する方法)は何ですか?私はcgroupや他の同様の選択肢について知っていますが、学ぶためにこの記事を書こうとしていますが、この動作は本当に混乱しています。
私はRLIMIT_NPROCのドキュメントに「最大プロセス数(またはより正確にはLinuxではスレッド)」と生成されたスレッドの数が制限されていると述べていますが、RLIMIT_NPROCを増やすことでのみ可能だと思いました。 to 500は、プログラムが動作するか、それと同様のものが合理的ではないようです。
この動作が予期しない場合はコーディングエラーになる可能性があり、その場合はここに投稿するテストコードをクリーンアップしようとします。
答え1
RLIMIT_NPROCは、プロセスが持つことができる子プロセスの数を制御しません。
総プロセス数を制御します。ユーザーそうかもしれません。より具体的には、プロセス固有の設定なので、プロセスがfork()、clone()、vfork()などを呼び出すとき、そのプロセスのRLIMIT_NPROC値は次のようになります。みんなプロセスの親プロセスのプロセス数ユーザー、プロセス内の子プロセスの数ではありません。
答え2
マニュアルページにgetrlimit(2)
制限があることを理解しています。糸(ここでは関係ありません)は、実際のユーザーとして実行できます。
あなたが何をしているのかよくわかりません。だからご了承ください。リストされたスクリプトをインポートし、下付き文字で実行するプログラムを起動します。同時にps
PIDを確認するために走りましたか?
ユーザーが実行しているシェルは間違いなく1つで、スクリプトを起動するプログラムは別のもので、スクリプトが実行されている場合はpsが5を作成します。これで、psが独自の内部目的でスレッドを起動しようとすると、5つのプロセス制限が原因で失敗します。
あなたが説明するのは、何かをする方法を学ぶための実験のようなもののようです。あなたが本当に解決したい問題は何ですか?それが何であるかを知らなければ、より良い選択肢を提案することはできません(またはあなたが望むことをする方法を教えてくれません)。