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.
loop.sh, portanto, precisa resolvê-lo sozinho.