Question

J'ai un très grand nombre de commandes shell en cours d'exécution avec la racine des privilèges / admin par l'appel « de AuthorizationExecuteWithPrivileges » autorisation de services. Le problème est que, après un certain temps (10-15 secondes, peut-être 100 commandes shell) le programme cesse de répondre à cette erreur dans le débogueur:

ne pouvait pas la fourche: errno 35

Et puis lorsque l'application est en cours d'exécution, je ne peux pas lancer des applications plus. Je cette question et fait des recherches apparemment cela signifie qu'il n'y a pas plus de threads disponibles pour le système à utiliser. Cependant, j'ai vérifié à l'aide Activity Monitor et mon application est seulement en utilisant 4-5 fils.

Pour résoudre ce problème, je pense que ce que je dois faire est de séparer les commandes shell dans un thread séparé (loin du fil conducteur). Je ne l'ai jamais utilisé le filetage avant, et je ne suis pas sûr où commencer (pas d'exemples complets que je pourrais trouver)

Merci

Était-ce utile?

La solution

Comme Louis Gerbarg déjà fait, votre question n'a rien à voir avec des fils. J'ai modifié votre titre et les balises en conséquence.

  

J'ai un très grand nombre de commandes shell en cours d'exécution avec la racine des privilèges / admin par l'appel « de AuthorizationExecuteWithPrivileges » autorisation de services.

Ne pas faire. Cette fonction existe seulement afin de pouvoir restaurer la racine:. La propriété admin et le bit de mode setuid à l'outil que vous souhaitez exécuter en tant que root

L'idée est que vous devez factoriser le code qui devrait fonctionner en tant que root dans un programme complètement séparé de la partie qui n'a pas besoin de fonctionner en tant que root, de sorte que la partie qui a besoin de racine peut avoir (par le bit setuid ) et la partie qui n'a pas besoin racine peut aller sans elle (par ne pas avoir setuid).

Un exemple de code est dans le .

  

Le problème est que, après un certain temps (10-15 secondes, peut-être 100 commandes shell) le programme cesse de répondre à cette erreur dans le débogueur:

couldn't fork: errno 35

Oui. Vous ne pouvez exécuter une centaine de processus ou deux à la fois. Ceci est une limite forcée OS.

Il est une limite douce, ce qui signifie que vous pouvez soulever, mais seulement jusqu'à la limite dure, que vous ne pouvez pas soulever. Voir la sortie de limit et limit -h (en zsh, je ne sais pas d'autres coquilles).

Vous devez attendre des processus pour terminer avant d'exécuter plusieurs processus.

  

Et puis lorsque l'application est en cours d'exécution, je ne peux pas lancer des applications plus.

Parce que vous êtes déjà en cours d'exécution autant de processus que vous avez le droit. Cette limite x cent processus par utilisateur, et non par processus.

  

Je cette question et fait des recherches apparemment cela signifie qu'il n'y a pas plus de threads disponibles pour le système à utiliser.

Non, il ne fonctionne pas.

Les codes d'erreur errno sont utilisés pour beaucoup de choses. EAGAIN (35, « ressource temporairement indisponible ») peut vouloir dire pas plus de fils lorsqu'elle est définie par un appel système qui démarre un fil, mais il ne signifie pas que lorsqu'il est réglé par un autre appel système ou une fonction.

Le message d'erreur que vous avez cité explicitement dit qu'il a été fixé par fork, qui est l'appel système pour démarrer une nouvelle processus , pas un nouveau thread . Dans ce contexte, EAGAIN signifie « vous êtes déjà en cours d'exécution autant de processus que vous pouvez ». Voir la fourche manpage.

  

Cependant, j'ai vérifié à l'aide Activity Monitor et mon application est seulement en utilisant 4-5 fils.

Voir?

  

Pour résoudre ce problème, je pense que ce que je dois faire est de séparer les commandes shell dans un thread séparé (loin du fil conducteur).

A partir d'un processus par thread ne vous aider à court de processus beaucoup plus rapide.

  

Je ne l'ai jamais utilisé le filetage avant ...

Il semble que vous avez toujours pas, puisque la fonction que vous faites référence démarre un processus, pas un fil.

Autres conseils

Ce n'est pas sur les threads (au moins pas threads dans votre application). Il s'agit sur les ressources système. Chacun de ces processus fourchues consomme au moins 1 thread noyau (peut-être plus), certains vnodes, et un certain nombre d'autres choses. Finalement, le système ne vous permettra pas d'engendrer davantage de processus.

Les premières limites que vous frappez des limites administratives. Le système peut prendre en charge plus, mais il peut provoque une dégradation des performances et d'autres questions. Vous pouvez augmenter généralement ces à travers diverses mecahanisms, comme sysctls. D'une manière générale faire ce qui est une mauvaise idée, sauf si vous avez une charge de travail particulière (spéciale) que vous savez bénéficier de quelques réglages spécifiques.

Les chances élèvent ces limites ne résoudra pas vos problèmes. Lors du réglage de ces limites peut vous faire courir un peu plus longtemps, afin de fixer réellement vous devez comprendre pourquoi les ressources ne sont pas retournés au système. Sur la base de ce que vous avez décrit ci-dessus, je suppose que vos processus fourchues ne sont jamais quitter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top