Frage

Ich habe eine massive Anzahl von Shell-Befehle mit root / admin Privilegien durch ‚AuthorizationExecuteWithPrivileges‘ call Autorisierungsdienste ausgeführt wird. Das Problem ist, dass nach einer gewissen Zeit (10-15 Sekunden, vielleicht 100 Shell-Befehle) stoppt das Programm mit diesem Fehler im Debugger reagiert:

konnte nicht blechen: errno 35

Und dann, während die App läuft, kann ich keine weiteren Anwendungen starten. Ich erforschte dieses Problem und scheinbar bedeutet es, dass es nicht mehr Threads zur Verfügung für das System zu verwenden sind. Allerdings habe ich gecheckt nur Activity Monitor und meine app ist 4-5 Threads.

Um dieses Problem zu beheben, ich denke, was ich tun muß, ist getrennt die Shell-Befehle in einen separaten Thread (weg von dem Haupt-Thread). Ich habe Threading noch nie benutzt, und ich bin nicht sicher, wo ich anfangen soll (keine umfassenden Beispiele, die ich finden konnte)

Danke

War es hilfreich?

Lösung

Wie Louis Gerbarg bereits darauf hingewiesen, Ihre Frage hat nichts mit Themen zu tun. Ich habe bearbeitet Titel und Tags entsprechend.

  

Ich habe eine massive Anzahl von Shell-Befehle mit root / admin Privilegien durch "AuthorizationExecuteWithPrivileges" call Autorisierungsdienste ausgeführt wird.

Tu das nicht. Diese Funktion existiert nur, damit Sie die Wurzel wiederherstellen. Admin Eigentum und das setuid Modusbit auf das Werkzeug, das Sie als root ausführen möchten

Die Idee ist, dass Sie den Code ausklammern sollte, die als root in ein völlig separates Programm von dem Teil ausgeführt werden soll, der muss nicht als root ausführen, so dass der Teil, der Wurzel braucht es (durch das setuid Bit haben kann ) und der Teil, der nicht root braucht, ohne es gehen kann (durch nicht setuid haben).

Ein Codebeispiel ist in der Authorization Service Programming Guide .

  

Das Problem ist, dass nach einer gewissen Zeit (10-15 Sekunden, vielleicht 100 Shell-Befehle) stoppt das Programm mit diesem Fehler im Debugger reagiert:

couldn't fork: errno 35

Ja. Sie können nur ein paar hundert Prozesse zu einem Zeitpunkt ausgeführt. Dies ist ein O erzwungene Grenze.

Es ist eine weiche Grenze, was bedeutet, dass Sie es aber erhöhen können nur auf die harte Grenze auf, die Sie nicht erhöhen können. Sehen Sie sich die Ausgabe von limit und limit -h (in zsh; ich weiß nicht, über andere Schalen).

Sie müssen warten, für Prozesse vor beenden mehr Prozesse ausgeführt werden.

  

Und dann, während die App läuft, kann ich keine weiteren Anwendungen starten.

Da Sie bereits laufen so viele Prozesse wie Sie erlaubt sind. Die x-hundert-Prozess Grenze pro Benutzer, nicht pro-Prozess.

  

erforschte ich dieses Problem und scheinbar bedeutet es, dass es keine weiteren Threads sind für das System zu nutzen.

Nein, es funktioniert nicht.

Die errno Fehlercodes sind für viele Dinge verwendet. EAGAIN (35, „resource vorübergehend nicht erreichbar“) darf nicht mehr Fäden bedeuten, wenn von einem Systemaufruf festgelegt, die einen Thread startet, aber es bedeutet nicht, dass, wenn von einem anderen Systemaufruf oder Funktion gesetzt.

Die Fehlermeldung Sie ausdrücklich zitiert, sagt, dass es von fork gesetzt wurde, die der Systemaufruf ist einen neuen Prozess , keinen neuen Thread zu starten. In diesem Zusammenhang EAGAIN bedeutet „Sie laufen bereits so viele Prozesse wie möglich“. Siehe der Gabel manpage .

  

Allerdings habe ich gecheckt Activity Monitor und meine app ist nur 4-5 Threads.

Sehen Sie?

  

Um dieses Problem zu beheben, ich denke, was ich tun muß, ist getrennt die Shell-Befehle in einen separaten Thread (weg von dem Haupt-Thread).

Starten eines Prozesses pro Thread nur aus Prozessen helfen, viel schneller laufen.

  

habe ich nie verwendet Einfädeln vor ...

Es klingt wie Sie haben immer noch nicht, da die Funktion auf Sie beziehen einen Prozess startet, kein Gewinde.

Andere Tipps

Es geht nicht um Fäden (zumindest nicht Threads in Ihrer Anwendung). Hier geht es um Systemressourcen. Jede dieser gegabelten Prozesse verbraucht mindestens 1 Kernel-Thread (vielleicht auch mehr), einige vnodes, und eine Reihe anderer Dinge. Schließlich wird das System nicht zulassen, dass Sie mehrere Prozesse, um laichen.

Die ersten Grenzen Sie treffen sind administrative Grenzen. Das System kann mehr unterstützen, aber es kann verminderte Leistung und andere Probleme verursacht. Sie können in der Regel diese durch verschiedene mecahanisms, wie sysctls erhöhen. In der Regel, das zu tun ist eine schlechte Idee, wenn Sie eine bestimmte (Sonder-) Arbeitsbelastung haben, die Sie wissen, wird von spezifischen Optimierungen profitieren.

Die Chancen heben diese Grenzen nicht Ihre Probleme beheben. Während diese Grenzen Einstellung können Sie ein wenig länger, um laufen zu lassen, um es tatsächlich zu beheben müssen Sie die Ressourcen, um herauszufinden, warum nicht an das System zurückgegeben werden. Basierend auf, was Sie beschrieben oben Ich würde vermuten, dass Ihre gegabelt Prozesse sind nie verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top