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.







  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts