RLIMIT_NPROCが突然パニックになりました。

RLIMIT_NPROCが突然パニックになりました。

私の小さなスクリプトはシェルを起動し、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)制限があることを理解しています。(ここでは関係ありません)は、実際のユーザーとして実行できます。

あなたが何をしているのかよくわかりません。だからご了承ください。リストされたスクリプトをインポートし、下付き文字で実行するプログラムを起動します。同時にpsPIDを確認するために走りましたか?

ユーザーが実行しているシェルは間違いなく1つで、スクリプトを起動するプログラムは別のもので、スクリプトが実行されている場合はpsが5を作成します。これで、psが独自の内部目的でスレッドを起動しようとすると、5つのプロセス制限が原因で失敗します。

あなたが説明するのは、何かをする方法を学ぶための実験のようなもののようです。あなたが本当に解決したい問題は何ですか?それが何であるかを知らなければ、より良い選択肢を提案することはできません(またはあなたが望むことをする方法を教えてくれません)。

関連情報