Andei pesquisando sobre este assunto e não tenho ainda uma conclusão firmada.
Até onde andei vendo, a maioria de daemons no GNU/Linux foram feitos em C. Quando eles fazem seus loops procuram deixar de fora o máximo de informações que não sejam necessárias para poupar recursos da CPU.
O problema é que parece que no caso do C, mesmo ele rodando várias instâncias de um mesmo aplicativo, parece que eles não geram novos programas na memória e sim processos filhos. Não sei explicar como isso funciona. Parece controlar de dentro de um único executável várias instâncias.
Em shell script isso não é possível. Pelo menos até onde andei vendo, exemplo:
Vamos supor que tenho um script que está no cron. Trabalhando similar a um daemon executando loop infinito.
Se no loop eu uso algum comando para funções, expansão de variáveis, concatenação de variáveis, teste de valores númericos, timeouts (sleep), eles geram novos forks e consequentemente, outros processos com pids. exemplo prático.
function mytempo()
{
local tempo
tempo="$1"
sleep tempo
}
function trabalhando()
{
local algumtrabalho
algumtrabalho=date
}
while true ; do
mytempo 10 # meu tempo vai depender da função trabalhando em algum momento.
trabalhando
done
Perguntas:
- Por que é melhor deixar o laço de tempo fora do while principal ?
- Por que sleep, date, geram novos processos ?
- Tem como evitar ?
Tenho um único script rodando no cron que gera chamada a 500 outros passando parâmetros diferentes. Quando estão processando, tem 500 forks + X forks de vários processos.
O consumo de memória é pequeno. De cpu idem, mas antes não era assim. Após retirar todas as instruções de dentro do while principal a coisa melhorou uma barbaridade. Lembrando que de qualquer forma ele chama duas funções dentro do loop. A diferença é que não fica rodando o loop dentro do while e sim na função mytempo.
Sinceramente, não entendo.
Em tempo: Os scripts são enormes. Estes códigos acima só foram colocados para entendimento do que acontece no geral.