Qual a melhor forma de economizar recursos em loops usando shell script

1. Qual a melhor forma de economizar recursos em loops usando shell script

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 04/05/2012 - 08:35h

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.