Fazer um loop e executar ls em um script bash, recurso temporariamente indisponível?

0

Às vezes, tenho um processo que leva horas de cada vez para concluir 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 é executado ls foldernamesrepetidamente com um sono de 5 segundos entre.

Funciona para esse fim (não pergunte por que não tenho um sistema de notificação melhor, essa foi apenas uma solução temporária adhoc). No entanto, se o script for executado por um longo período de tempo (uma hora?), Em vez de gerar 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!

StackOverflowed
fonte
Você é o único que conhece o conteúdo e loop.sh, portanto, precisa resolvê-lo sozinho.
IPOR Sircer
Eu não estou pedindo para depurar o script (desculpe se eu parecia que estava), eu queria saber o que resultaria / poderia consistentemente resultar em um erro temporariamente indisponível do recurso.
precisa
Na verdade, você provavelmente está nos pedindo para depurar o script, pois aparentemente está consumindo algum tipo de recurso limitado enquanto é executado e, eventualmente ... acaba. Pode ser outra coisa no servidor, mas como você indica que isso acontece depois que o script está em execução há um tempo, estou apostando no script. Mas que recurso e por que o está consumindo? Isso só pode ser respondido olhando o script. Grepping para "fork: tente novamente: recurso temporariamente indisponível" fornecerá o máximo de informações possível, com base no que você nos disse.
Gordon Davisson

Respostas:

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 date | od -ab, cria dois processos. Mas normalmente você não recebe o prompt do shell de volta (ou, conforme o caso, prossegue para a próxima linha em um script) até que os processos que você criou tenham terminado e desaparecido.

No entanto, quando você executa um comando em segundo plano (por exemplo, with command &), pode fazer outras coisas sem esperar pelo (s) processo (s) que você criou para terminar. Essa pode ser uma capacidade muito poderosa, mas facilita a criação de muitos processos. E existem limites além dos quais você obterá "Recurso temporariamente indisponível".

Tem certeza de que seu script de monitoramento está causando o problema (ou está sofrendo apenas dos sintomas)? O que é esse "processo [que você tem] que leva horas de cada vez às vezes para ser concluído"? Poderia ele 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 isolar o problema:

  • Inicie o processo "horas de cada vez". Esperar uma hora (use um despertador, ou uma ampulheta, se isso ajuda) e , em seguida, iniciar o script de monitoramento. Falhará muito em breve? Nesse caso, o problema provavelmente está no processo de "horas de cada vez". Ele funciona por uma hora (essa seria a segunda hora de execução do processo "horas de cada vez") e depois falha? Nesse caso, o problema provavelmente está no script de monitoramento.
  • Mude o sono de 5 para 30. Ainda falha após uma hora? Nesse caso, o problema provavelmente está no processo de "horas de cada vez". Consegue durar seis horas? Nesse caso, o problema provavelmente está no script de monitoramento.
  • Olhe para o seu script e veja se há algum comando &. Existem waitcomandos? Se o processo de "horas de cada vez" for um script, faça o mesmo por ele. Se é um programa compilado, e você tem a fonte, olhar através dele para chamadas para fork(), vfork(), spawn()e system()(e wait()), e veja se você pode descobrir o que está acontecendo.
  • Como último recurso, edite sua pergunta para incluir todos os detalhes relevantes (incluindo os resultados dos testes acima) e, talvez, alguém possa lhe dar uma resposta específica.

Para responder à sua última pergunta: sim, ficar sem qualquer recurso é ruim para o sistema.
________
1 Ou, pelo menos, fork()é uma das chamadas do sistema que criam novos processos.


PS O título da sua pergunta sugere que você suspeita que lsseja responsável, mas as mensagens de erro não dizem isso. É provável que o erro seja proveniente de sleep- ou, para ser mais preciso, as mensagens de erro provavelmente se alternam: uma de ls, uma de sleep, uma de ls, uma de sleepetc.

G-Man
fonte