Pergunta

Eu tenho um grande número de comandos shell sendo executados com privilégios de root/admin por meio da chamada "AuthorizationExecuteWithPrivileges" dos Serviços de Autorização.O problema é que depois de um tempo (10-15 segundos, talvez 100 comandos shell) o programa para de responder com este erro no depurador:

não consegui desembolsar:erro 35

E então, enquanto o aplicativo está em execução, não consigo iniciar mais aplicativos.Pesquisei esse problema e aparentemente significa que não há mais threads disponíveis para o sistema usar.No entanto, verifiquei usando o Activity Monitor e meu aplicativo está usando apenas 4 a 5 threads.

Para corrigir esse problema, acho que preciso fazer é separar os comandos do shell em um thread separado (longe do thread principal).Nunca usei threading antes e não sei por onde começar (não encontrei exemplos abrangentes)

Obrigado

Foi útil?

Solução

Como Louis Gerbarg já apontou, sua pergunta não tem nada a ver com threads.Editei seu título e tags de acordo.

Eu tenho um grande número de comandos shell sendo executados com privilégios de root/admin por meio da chamada "AuthorizationExecuteWithPrivileges" dos Serviços de Autorização.

Não faça isso.Essa função existe apenas para que você possa restaurar a propriedade root:admin e o bit do modo setuid para a ferramenta que deseja executar como root.

A idéia é que você fatore o código que deve ser executado como root em um programa completamente separado da parte que não precisa ser executada como root, para que a parte que precisa de root possa tê-lo (através do bit setuid) e o parte que não precisa de root pode ficar sem ele (por não ter setuid).

Um exemplo de código está no Guia de programação de serviços de autorização.

O problema é que depois de um tempo (10-15 segundos, talvez 100 comandos shell) o programa para de responder com este erro no depurador:

couldn't fork: errno 35

Sim.Você só pode executar algumas centenas de processos por vez.Este é um limite imposto pelo sistema operacional.

É um limite flexível, o que significa que você pode aumentá-lo – mas apenas até o limite rígido, que você não pode aumentar.Veja a saída de limit e limit -h (em zsh;Não sei sobre outras conchas).

Você precisa aguardar a conclusão dos processos antes de executar mais processos.

E então, enquanto o aplicativo está em execução, não consigo iniciar mais aplicativos.

Porque você já está executando tantos processos quanto lhe é permitido.Esse limite de x cem processos é por usuário, não por processo.

Pesquisei esse problema e aparentemente significa que não há mais threads disponíveis para o sistema usar.

Não, não tem.

Os códigos de erro errno são usados ​​para muitas coisas. EAGAIN (35, “recurso temporariamente indisponível”) pode significar que não há mais threads quando definido por uma chamada de sistema que inicia um thread, mas não significa isso quando definido por outra chamada de sistema ou função.

A mensagem de erro que você citou diz explicitamente que foi definida por fork, que é a chamada do sistema para iniciar um novo processo, não é um novo fio.Nesse contexto, EAGAIN significa “você já está executando tantos processos quanto possível”.Ver a página de manual do fork.

No entanto, verifiquei usando o Activity Monitor e meu aplicativo está usando apenas 4 a 5 threads.

Ver?

Para corrigir esse problema, acho que preciso fazer é separar os comandos do shell em um thread separado (longe do thread principal).

Iniciar um processo por thread só ajudará você a ficar sem processos com muito mais rapidez.

Nunca usei threading antes...

Parece que ainda não o fez, já que a função a que você está se referindo inicia um processo, não um thread.

Outras dicas

Não se trata de threads (pelo menos não threads em seu aplicativo). Trata -se de recursos do sistema. Cada um desses processos bifurcados está consumindo pelo menos 1 fio do kernel (talvez mais), alguns vnodes e várias outras coisas. Eventualmente, o sistema não permitirá gerar mais processos.

Os primeiros limites que você atinge são limites administrativos. O sistema pode suportar mais, mas pode causar desempenho degradado e outros problemas. Geralmente, você pode aumentá -los através de vários mecahanismos, como sysctls. Em geral, fazer isso é uma má idéia, a menos que você tenha uma carga de trabalho (especial) específica que você sabe que se beneficiará de ajustes específicos.

As chances estão levantando esses limites não resolverão seus problemas. Embora o ajuste desses limites possa fazer você funcionar um pouco mais, para realmente corrigi -lo, você precisa descobrir por que os recursos não estão sendo devolvidos ao sistema. Com base no que você descreveu acima, acho que seus processos bifurcados nunca estão saindo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top