Pregunta

Tengo un número masivo de comandos de shell que se ejecuta con privilegios de root / administrador a través de la llamada 'AuthorizationExecuteWithPrivileges' Autorización de Servicios. La cuestión es que después de un tiempo (10-15 segundos, tal vez 100 comandos shell) el programa deja de responder con este error en el depurador:

No se pudo desembolsar: errno 35

Y a continuación, mientras que la aplicación se está ejecutando, no puedo lanzar ningún más aplicaciones. He investigado este asunto y al parecer esto significa que no hay más temas disponibles para el sistema a utilizar. Sin embargo, he comprobado el uso de Monitor de Actividad y mi aplicación sólo está utilizando hilos 4-5.

Para solucionar este problema, creo que lo que tengo que hacer es separar los comandos de shell en un hilo separado (distancia desde el hilo principal). Nunca he utilizado roscado antes, y estoy seguro de por dónde empezar (no hay ejemplos completos que pude encontrar)

Gracias

¿Fue útil?

Solución

Como Louis Gerbarg ya se ha señalado, su pregunta no tiene nada que ver con las discusiones. He editado el título y las etiquetas en consecuencia.

  

He un número masivo de comandos shell de ser ejecutado con privilegios de root / administrador a través de la llamada 'AuthorizationExecuteWithPrivileges' Autorización de Servicios.

No hacer eso. Esa función sólo existe para que pueda restaurar la raíz:. La propiedad de administración y el modo setuid bits a la herramienta que desea ejecutar como root

La idea es que se debe factorizar el código que se debe ejecutar como root en un programa completamente separada de la parte que no necesita para funcionar como root, por lo que la parte que necesita la raíz puede tenerlo (a través del bit setuid ) y la parte que no necesita de la raíz puede ir sin él (por no tener setuid).

Un ejemplo es el código de la .

  

La cuestión es que después de un tiempo (10-15 segundos, tal vez 100 comandos shell) el programa deja de responder con este error en el depurador:

couldn't fork: errno 35

Sí. Sólo puede ejecutar un par de cientos de procesos a la vez. Este es un límite OS-forzada.

Es un límite blando, lo que significa que puede levantarlo, pero sólo hasta el límite duro, que no se puede aumentar. Ver la salida del limit y limit -h (en zsh; no sé acerca de otras conchas).

Es necesario esperar a que los procesos terminen antes de ejecutar más procesos.

  

Y a continuación, mientras que la aplicación se está ejecutando, no puedo lanzar ningún más aplicaciones.

Debido a que ya está ejecutando la mayor cantidad de procesos que se le permite. Ese límite de cien proceso x es por usuario, no por proceso.

  

He investigado este asunto y al parecer esto significa que no hay más subprocesos disponibles para el sistema a utilizar.

No, no lo hace.

Los códigos de error errno se utilizan para muchas cosas. EAGAIN (35, “recurso temporalmente no disponible”) puede significar no hay más hilos cuando se establece por una llamada de sistema que se inicia un hilo, pero no significa que cuando se establece por otra llamada o la función del sistema.

El mensaje de error que usted ha citado explícitamente dice que fue establecido por fork, que es la llamada al sistema para iniciar una nueva Proceso , no una nueva hilo . En ese contexto, significa EAGAIN “ya está ejecutando tantos procesos como sea posible”. Ver la página de manual tenedor .

  

Sin embargo, he comprobado el uso de Monitor de Actividad y mi aplicación sólo está utilizando hilos 4-5.

Vea?

  

Para solucionar este problema, creo que lo que tengo que hacer es separar los comandos de shell en un hilo separado (distancia desde el hilo principal).

A partir de un proceso por el hilo sólo le ayudará a ejecutar fuera de procesos mucho más rápido.

  

Nunca he utilizado antes de enhebrar ...

Parece que usted todavía no tiene, ya que la función que usted se refiere inicia un proceso, no un hilo.

Otros consejos

No se trata de hilos (al menos no subprocesos de su aplicación). Esto se trata de recursos del sistema. Cada uno de esos procesos bifurcados es consumir al menos 1 hilo del núcleo (tal vez más), algunos vnodes, y una serie de otras cosas. Eventualmente, el sistema no le permitirá a desovar más procesos.

Los primeros límites superados son límites administrativos. El sistema puede soportar más, pero es posible que hace que el rendimiento sea menor y otros temas. Generalmente, usted puede aumentar estos a través de diversos mecahanisms, como sysctls. En general haciendo que es una mala idea a menos que tenga una carga de trabajo en particular (especial) que sabe que beneficiarse de ajustes específicos.

Es probable que destaquen los límites no solucionará sus problemas. Mientras que el ajuste de esos límites puede hacer que se ejecute un poco más, con el fin de fijar en realidad necesita averiguar por qué los recursos no están siendo devueltos al sistema. Sobre la base de lo que se ha descrito anteriormente yo supongo que sus procesos están bifurcadas no salir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top