À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 foldernames
repetidamente 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!
linux
bash
runtime-error
StackOverflowed
fonte
fonte
loop.sh
, portanto, precisa resolvê-lo sozinho.Respostas:
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 pipelinedate | 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:
&
. Existemwait
comandos? 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 parafork()
,vfork()
,spawn()
esystem()
(ewait()
), e veja se você pode descobrir o que está acontecendo.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
ls
seja responsável, mas as mensagens de erro não dizem isso. É provável que o erro seja proveniente desleep
- ou, para ser mais preciso, as mensagens de erro provavelmente se alternam: uma dels
, uma desleep
, uma dels
, uma desleep
etc.fonte