私は100の以上のプロセスを実行することはできません
-
19-09-2019 - |
質問
私は承認サービス 『AuthorizationExecuteWithPrivileges』呼び出してルート/管理者privelegesで実行されているシェルコマンドの膨大な数を持っています。問題は、しばらく(10〜15秒、多分100シェルコマンド)プログラムは、デバッガでこのエラーで応答を停止した後:
forkできませんでした:エラー番号35
そして、アプリが実行されている間、私はより多くのアプリケーションを起動することはできません。私はこの問題を調査し、明らかにそれを使用するシステムで利用できるより多くのスレッドが存在しないことを意味します。しかし、私は、アクティビティモニタを使用して、私のアプリは、4-5のスレッドを使用して確認します。
この問題を解決するには、私は何をする必要があるかと思いますが(離れて、メインスレッドから)別のスレッドへのシェルコマンド別のものです。どこから始めれば私が前にスレッドを使用したことがない、と私はわからないんだ(私は見つけることができませんでした包括的な例)
おかげ
解決
、あなたの質問は、スレッドとは何の関係もありません。私はそれに応じて、タイトルとタグを編集した。
私は承認サービス 『AuthorizationExecuteWithPrivileges』呼び出してルート/管理者privelegesで実行されているシェルコマンドの膨大な数を持っています。
それをしないでください。あなたがルート復元することができますので、その関数のみ存在します。rootとして実行したい管理者所有権およびツールへのsetuidモード・ビットを
アイデアはルートが必要な部分は、それを持つことができるように、あなたがsetuidビットを通じて(、rootとして実行する必要がない部分から完全に独立したプログラムにrootとして実行する必要があるコードを考慮すべきであるということです)とルートを必要としない部分)がsetuidさを持っていないから(それなしで行くことができます。
のコード例では、承認サービスプログラミングガイドのです。
問題は、しばらく(10〜15秒、多分100個のシェルコマンド)の後にプログラムがデバッガでこのエラーで応答を停止することです。
couldn't fork: errno 35
うん。あなたは一度に数百個のプロセスを実行することができます。これは、OS-強制制限されます。
それはあなたがそれを-が、上げることができる唯一のあなたは上げることができないハードリミット、までを意味し、ソフトリミットです。 (zshの中で、私は他のシェルを知らない)limit
とlimit -h
の出力を参照してください。
あなたは、プロセスが複数のプロセスを実行する前に終了するのを待つ必要があります。
そして、アプリが実行されている間、私はより多くのアプリケーションを起動することはできません。
あなたが許可されているとして、あなたがすでにできるだけ多くのプロセスを実行しているので。すなわち、X百プロセスの制限はないプロセスごと、ユーザごとである。
私はこの問題を調査し、明らかにそれを使用するシステムで利用できるより多くのスレッドが存在しないことを意味します。
いいえ、それはしません。
errnoにエラーコードは、多くのもののために使用されています。スレッドを開始するシステムコールによって設定された場合EAGAIN
(35、「一時的に利用できないリソース」)はこれ以上のスレッドを意味し得るが、それは別のシステムコールまたは関数により設定されたときことを意味するものではない。
あなたが明示的に引用されたエラーメッセージは、それが新しいのプロセスのではなく、新しいのスレッドのを開始するためのシステムコールである、fork
により設定されたことを述べています。その意味で、EAGAIN
は「することができますようにあなたがすでにできるだけ多くのプロセスを実行している」という意味します。 フォークのmanページを参照してください。
しかし、私は、アクティビティモニタを使用して、私のアプリは、4-5のスレッドを使用して確認します。
を参照してください?
この問題を解決するには、私は何をする必要があるかと思いますが(離れて、メインスレッドから)別のスレッドへのシェルコマンド別のものです。
スレッドごとに1つのプロセスを起動するだけで、あなたがはるかに高速のプロセスを使い果たすのに役立ちます。
あなたはまだ持っていないようにあなたが参照している機能は、プロセスではなく、スレッドを開始しますので、私は前にスレッドを使用したことがない...
これは、鳴ります。
他のヒント
このスレッド(アプリケーション内の少なくともいないスレッド)に関するものではありません。これは、システムリソースについてです。これらのフォークの各プロセスは、少なくとも1カーネルスレッド(多分それ以上)、いくつかのvnode、および他のものの数を消費しています。最終的にシステムは、あなたがより多くのプロセスを起動することはできません。
あなたがヒット最初の制限は、管理限界です。システムは、より多くのをサポートすることができますが、それは、パフォーマンスの低下やその他の問題が発生することがあります。あなたは、通常のsysctlのように、様々なmecahanismsを通じて、これらを上げることができます。あなたが特定の微調整の恩恵を受ける知っている特定の(特別な)作業負荷を持っていない限り、一般的にはそれを行うには悪い考えです。
チャンスはあなたの問題を解決しませんこれらの制限を上げています。これらの制限を調整するあなたは少し長く走らせるかもしれないが、実際にそれを修正するために、あなたは、リソースがシステムに返されていない理由を把握する必要があります。あなたは私があなたのフォークプロセスは決して出ていないことを推測する上で説明した内容に基づいています。