Domanda

Ho un massiccio numero di comandi di shell in esecuzione con privilegi di root / amministratore mediante autorizzazione Services' chiamata 'AuthorizationExecuteWithPrivileges'. Il problema è che dopo un po '(10-15 secondi, forse 100 comandi shell) il programma si blocca con questo errore nel debugger:

non è riuscito a fork: errno 35

E poi, mentre l'applicazione è in esecuzione, non posso lanciare qualsiasi più applicazioni. Ho studiato questo problema e apparentemente significa che non ci sono più thread disponibili per il sistema da utilizzare. Tuttavia, ho controllato utilizzando Activity Monitor e la mia app è solo con 4-5 fili.

Per risolvere questo problema, penso che quello che ho bisogno di fare è separare i comandi di shell in un thread separato (lontano dal thread principale). Non ho mai usato filettatura prima, e io sono sicuro da dove cominciare (esempi completi che ho trovato)

Grazie

È stato utile?

Soluzione

Come Louis Gerbarg già sottolineato, la tua domanda non ha nulla a che fare con i thread. Ho modificato il titolo e tag di conseguenza.

  

Ho un enorme numero di comandi di shell in esecuzione con privilegi di root / amministratore mediante autorizzazione Services' chiamata 'AuthorizationExecuteWithPrivileges'.

Non farlo. Tale funzione esiste solo in modo da poter ripristinare il root:. Titolarità admin e il bit di modalità setuid allo strumento che si desidera eseguire come root

L'idea è che si dovrebbe scomporre il codice che deve essere eseguito come root in un programma completamente separata dalla parte che non ha bisogno di girare come root, in modo che la parte che ha bisogno di root può avere (attraverso il bit setuid ) e la parte che non ha bisogno di root può andare senza di esso (attraverso non avendo setuid).

Un esempio di codice è nel Guida alla programmazione Autorizzazione Servizi .

  

Il problema è che dopo un po '(10-15 secondi, forse 100 comandi shell) il programma si blocca con questo errore nel debugger:

couldn't fork: errno 35

Sì. È possibile eseguire solo un paio di centinaia di processi alla volta. Questo è un limite OS-imposto.

E 'un limite soft, il che significa che è possibile alzarla, ma solo fino al limite rigido, che non si può alzare. Vedere l'uscita di limit e limit -h (in zsh, io non so su altre shell).

È necessario attendere per i processi per terminare prima di eseguire più processi.

  

E poi, mentre l'applicazione è in esecuzione, non posso lanciare qualsiasi più applicazioni.

Poiché si sta già eseguendo il maggior numero di processi, si è permesso di. Tale limite x-cento-processo è per-utente, non per-processo.

  

Ho studiato questo problema e apparentemente significa che non ci sono più thread disponibili per il sistema da utilizzare.

No, non è così.

I codici di errore errno sono usati per molte cose. EAGAIN (35, “risorsa temporaneamente non disponibile”) può significare altri fili quando impostato da una chiamata di sistema che avvia un thread, ma ciò non significa che quando impostato da un'altra chiamata o funzione di sistema.

Il messaggio di errore citato esplicitamente dice che è stato fissato dal fork, che è la chiamata di sistema per avviare un nuovo processo , non una nuova filo . In tale contesto, EAGAIN significa “è già in esecuzione il maggior numero di processi come si può”. Vedere la pagina di manuale forcella .

  

Tuttavia, ho controllato utilizzando Activity Monitor e la mia app è solo con 4-5 fili.

Vedi?

  

Per risolvere questo problema, penso che quello che ho bisogno di fare è separare i comandi di shell in un thread separato (lontano dal thread principale).

Con inizio un processo per thread solo aiuterà a corto di processi molto più veloce.

  

Non ho mai usato la filettatura prima ...

Sembra che tu non hai ancora, dal momento che la funzione ti riferisci avvia un processo, non un filo.

Altri suggerimenti

Non si tratta di discussioni (almeno non thread nell'applicazione). Si tratta di risorse di sistema. Ognuno di questi processi biforcuta sta consumando almeno 1 thread del kernel (forse più), alcune vnodi, e una serie di altre cose. Alla fine il sistema non consente di creare sotto più processi.

I primi limiti che hai superato sono dei limiti amministrativi. Il sistema è in grado di supportare più, ma può provoca degrado delle prestazioni e altre questioni. Di solito è possibile raccogliere questi attraverso vari mecahanisms, come sysctl. In generale, facendo che è una cattiva idea a meno che non si dispone di un particolare (speciale) carico di lavoro che si sa sarà beneficiare di modifiche specifiche.

Le probabilità stanno alzando tali limiti non risolverà i vostri problemi. Durante la regolazione tali limiti può rendere si esegue un po 'di più, al fine di risolvere il problema in realtà è necessario capire perché le risorse non vengono restituiti al sistema. Sulla base di quello che hai descritto sopra Direi che i processi biforcuta vengono mai uscire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top