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 wait
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 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 ls
seja 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 sleep
etc.
loop.sh
, portanto, precisa resolvê-lo sozinho.