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値は次のようになります。みんなプロセスの親プロセスのプロセス数ユーザー、プロセス内の子プロセスの数ではありません。

おすすめ記事