Fazendo loop e executando ls em um script bash, Resource Temporariamente Unavilable?

0

Eu tenho um processo que leva horas de vez em quando para ser concluído e, em vez de executar ls para ver se um arquivo associado é excluído para marcar a conclusão da tarefa, tenho um script que simplesmente executa ls foldernames over e acabou com um sono de 5 segundos no meio.

Funciona para o seu propósito (não pergunte por que eu não tenho um sistema de notificação melhor, isso era apenas uma solução temporária ad hoc). No entanto, se o script for executado por um longo período de tempo (uma hora?), Em vez de exibir o conteúdo do diretório, ele exibirá o seguinte erro:

./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable

Por que isso acontece? O script teve consequências negativas no servidor?

Obrigado!

    
por StackOverflowed 30.11.2016 / 01:59

1 resposta

1

fork() é a chamada do sistema que cria um novo processo 1 . Sempre que você executa um comando, você cria um processo. Quando você executa um pipeline como date | od -ab , você cria dois processos. Mas normalmente você não recebe seu aviso de shell (ou, conforme aplicável, vá para a próxima linha em um script) até que o (s) processo (s) criado (s) tenha terminado e desaparecido.

No entanto, quando você executa um comando em segundo plano (por exemplo, com command & ) você pode continuar fazendo outras coisas sem esperar que o (s) processo (s) criado (s) termine (s). Isso pode ser uma capacidade muito poderosa, mas facilita a criação de muitos processos. E existem limites além do qual você terá "Recurso temporariamente indisponível".

Tem certeza de que seu script de monitoramento está causando o problema (ou está apenas sofrendo dos sintomas)? O que é isso “Processo [que você tem] que leva horas de vez em quando para completar”? Poderia isso estar causando o problema? É um executável binário compilado ou é também um script? Se é um binário, você tem o código fonte?

Aqui estão algumas coisas que você pode tentar para isolar o problema:

  • Inicie o processo de "horas por vez". Espere uma hora (use um despertador ou uma ampulheta, se isso ajudar) e então inicia o script de monitoramento. Isso falha muito em breve? Nesse caso, o problema provavelmente está no processo de “horas por vez”. Funciona por uma hora? (esta seria a hora da execução segundo do processo “horas por vez”) e depois falhar? Em caso afirmativo, o problema provavelmente está no script de monitoramento.
  • Altere o período de sono de 5 para 30. Ainda falha após uma hora? Nesse caso, o problema provavelmente está no processo de “horas por vez”. Consegue durar seis horas? Em caso afirmativo, o problema provavelmente está no script de monitoramento.
  • Examine seu script e veja se algum comando tem & . Há algum comando wait ? Se o processo de “horas por vez” for um script, faça o mesmo por ele. Se é um programa compilado e você tem a fonte, procure por chamadas para fork() , vfork() , spawn() e system() (e wait() ), e veja se você consegue descobrir o que está acontecendo.
  • Como último recurso edite sua pergunta para incluir todos os detalhes relevantes (incluindo os resultados dos testes acima), e então talvez alguém possa lhe dar uma resposta específica.

Para responder sua última pergunta: sim, ficar sem recursos é ruim para o sistema.

por 30.11.2016 / 07:08