Onde está o erro ??? [RESOLVIDO]

1. Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 19:33h

Pessoas ... tenho o seguinte script
#!/bin/bash

livre=`cat /proc/meminfo | grep "^MemFree" | tr -s ' ' | cut -d ' ' -f2` && livre=`echo "$livre/1024.0" | bc`
total=`cat /proc/meminfo | grep "^MemTotal" | tr -s ' ' | cut -d ' ' -f2` && total=`echo "$total/1024.0" | bc`
start=`echo 2500`
ativo=`uptime | awk '{print $3}'`
log="/home/mauricio/logs/agenda_cache.txt"
hora=`date +%H:%M:%S`

if [ "$ativo" -lt 6 ]; then
rm -f $log
fi

if [ "$livre" -le "$start" ]
then
sync; echo 3 > /proc/sys/vm/drop_caches
echo "$hora" >> $log
else
echo "$hora -> Não executado" >> $log
fi

exit 0


pois bem .. se eu executo ele pelo terminal tudo funciona 100%, porém quando coloco ele no cron só essa parte é executada

if [ "$livre" -le "$start" ]
then
sync; echo 3 > /proc/sys/vm/drop_caches
echo "$hora" >> $log


o script roda de 5 em 5 minutos, então na primeira execução era para o "RM" funcionar ... não rola
Se o script não executa a limpeza de cache o "else" tb não executa !!

então .. onde estou errando ???

Lembrando que se eu executo ele manualmente tudo funciona 100% !!!


  


2. MELHOR RESPOSTA

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 24/10/2017 - 19:51h

Não fiz testes aqui com o script, mas vc deve ter em mente que o crontab executa o script em um ambiente diferente do shell-login do usuário comum e portanto pode falhar por não encontrar as "variáveis de ambiente" e/ou "paths" dos executáveis que o script precisa.

Veja essa dica aqui para criar um log de erros para vc saber o que tá faltando declarar no script:
http://www.thegeekstuff.com/2012/07/crontab-log

3. Re: Onde está o erro ??? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/10/2017 - 19:54h

Uma dica: seu script funciona tranquilamente com o /bin/sh. Poupe seu tempo utilizando o dash do Debian, chega a ser 4x mais rápido que o bash.

Muitos que vivem merecem a morte. E alguns que morrem merecem viver. 
Você pode dar-lhes a vida?
Então não seja tão ávido para julgar e condenar alguém a morte.
Pois mesmo os muitos sábios não conseguem ver os dois lados.



4. Re: Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 20:22h

Ryuk escreveu:

Não fiz testes aqui com o script, mas vc deve ter em mente que o crontab executa o script em um ambiente diferente do shell-login do usuário comum e portanto pode falhar por não encontrar as "variáveis de ambiente" e/ou "paths" dos executáveis que o script precisa.

Veja essa dica aqui para criar um log de erros para vc saber o que tá faltando declarar no script:
http://www.thegeekstuff.com/2012/07/crontab-log


Depois a gente senta a bicuda na porcario do PC pq as paradas não funcionam e somos adjetivados de "ignorante", "Grosso" e afins. .....

Seguinte velho ... eu coloquei o script original no cron e fiz outro ( o que postei o código ) baseado nele, só q esqueci de editar o Cron setando para o novo script ... como no original só tinha uma parte em comum com o que eu fiz o corno não ia funcionar nunca mesmo ... kkkkkkkkkkkkkkkkkk

Descobri pq no log que vc me sugeriu apareceu um "echo" do script original ...

kkkkkkkkkkkkkkkk ... complicado o ser Humano viu !!! kkkkkkkkkkkkkkkk


------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



5. Re: Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 20:26h

mithrandir escreveu:
Uma dica: seu script funciona tranquilamente com o /bin/sh. Poupe seu tempo utilizando o dash do Debian, chega a ser 4x mais rápido que o bash.


A velho ... já ouvi falar nisso ... mais nem tô afim de vasculhar o tal do SH pra ver o q funciona nele ou não !!!

tem um resumão aí do q NÃO funciona ???

OBS: se bem q no caso desse meu Script ( q deve demorar 1S ) não vai fazer muita diferença !!!


------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



6. Re: Onde está o erro ??? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/10/2017 - 20:35h

Resumão eu não tenho, mas sei de um bom referencial: http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
Se fizer realmente um shell script POSIX, funcionará no mksh, dash, ash, bash, zsh, fish, etc.


Muitos que vivem merecem a morte. E alguns que morrem merecem viver. 
Você pode dar-lhes a vida?
Então não seja tão ávido para julgar e condenar alguém a morte.
Pois mesmo os muitos sábios não conseguem ver os dois lados.



7. Re: Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 20:53h

mithrandir escreveu:

Resumão eu não tenho, mas sei de um bom referencial: http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
Se fizer realmente um shell script POSIX, funcionará no mksh, dash, ash, bash, zsh, fish, etc.



velho ... eu no máximo consigo fazer scriptzinhos básicos aqui ... não sei programar, não faço a menor idéia do que é POSIX e faz tempo q perdi o tesão de estudar alguma coisa .. vou aprendendo por osmose , de tanto fuçar !!!

mesmo assim valew !!!

Abçs !!!

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



8. Re: Onde está o erro ??? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/10/2017 - 20:57h

De nada.
Mais uma dica:

 
if [ "$ativo" -lt 6 ]; then
rm -f $log
fi


Se for uma decisão simples, faça com o operador lógico &&:

[ "$ativo" -lt 6 ] && rm -f $log


Muitos que vivem merecem a morte. E alguns que morrem merecem viver. 
Você pode dar-lhes a vida?
Então não seja tão ávido para julgar e condenar alguém a morte.
Pois mesmo os muitos sábios não conseguem ver os dois lados.



9. Re: Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 21:06h

mithrandir escreveu:
Se for uma decisão simples, faça com o operador lógico &&:

[ "$ativo" -lt 6 ] && rm -f $log



pode crer ... apesar de eu ter compreendido me diz ... pra q alterar a estrutura do IF ?? seria só para deixar o código mais "clean" ??? isso vale para qualquer linguagem ??? e comum programadores fazerem isso ??


------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



10. Re: Onde está o erro ??? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/10/2017 - 21:18h

Mauriciodez escreveu:
pode crer ... apesar de eu ter compreendido me diz ... pra q alterar a estrutura do IF ?? seria só para deixar o código mais "clean" ???

Uai, é uma questão de lógica mesmo.
Nesse caso, o conteúdo após o 'then' só será executado se a condição for verdadeira (e.g retornar um valor diferente de 0). Com o &&, também. Como é uma decisão simples (faça isso se determinada variável for menor que 6), vale mais a pena usar um operador lógico simples.

isso vale para qualquer linguagem ??? e comum programadores fazerem isso ??

Depende muito.


Muitos que vivem merecem a morte. E alguns que morrem merecem viver. 
Você pode dar-lhes a vida?
Então não seja tão ávido para julgar e condenar alguém a morte.
Pois mesmo os muitos sábios não conseguem ver os dois lados.



11. Re: Onde está o erro ??? [RESOLVIDO]

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 24/10/2017 - 21:25h

mithrandir escreveu:

Mauriciodez escreveu:
pode crer ... apesar de eu ter compreendido me diz ... pra q alterar a estrutura do IF ?? seria só para deixar o código mais "clean" ???

Uai, é uma questão de lógica mesmo.
Nesse caso, o conteúdo após o 'then' só será executado se a condição for verdadeira (e.g retornar um valor diferente de 0). Com o &&, também. Como é uma decisão simples (faça isso se determinada variável for menor que 6), vale mais a pena usar um operador lógico simples.

isso vale para qualquer linguagem ??? e comum programadores fazerem isso ??

Depende muito.
]


blz



------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



12. Re: Onde está o erro ??? [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 25/10/2017 - 16:23h

Mauriciodez escreveu:

Pessoas ... tenho o seguinte script
#!/bin/bash

livre=`cat /proc/meminfo | grep "^MemFree" | tr -s ' ' | cut -d ' ' -f2` && livre=`echo "$livre/1024.0" | bc`
total=`cat /proc/meminfo | grep "^MemTotal" | tr -s ' ' | cut -d ' ' -f2` && total=`echo "$total/1024.0" | bc`
start=`echo 2500`
ativo=`uptime | awk '{print $3}'`
log="/home/mauricio/logs/agenda_cache.txt"
hora=`date +%H:%M:%S`

if [ "$ativo" -lt 6 ]; then
rm -f $log
fi

if [ "$livre" -le "$start" ]
then
sync; echo 3 > /proc/sys/vm/drop_caches
echo "$hora" >> $log
else
echo "$hora -> Não executado" >> $log
fi

exit 0


pois bem .. se eu executo ele pelo terminal tudo funciona 100%, porém quando coloco ele no cron só essa parte é executada

if [ "$livre" -le "$start" ]
then
cat /proc/meminfo|awk '/MemFree:/{print ($2/1024)}' sync; echo 3 > /proc/sys/vm/drop_caches
echo "$hora" >> $log


o script roda de 5 em 5 minutos, então na primeira execução era para o "RM" funcionar ... não rola
Se o script não executa a limpeza de cache o "else" tb não executa !!

então .. onde estou errando ???

Lembrando que se eu executo ele manualmente tudo funciona 100% !!!


Mauricio, boa tarde.
Sei que esta resolvido, mas, segue uma dica para as variáveis livre e total:
livre=$(cat /proc/meminfo|awk '/^MemFree:/{"%.f" , ($2/1024)}')
total=$(cat /proc/meminfo|awk '/^MemTotal:/{"%.f" , ($2/1024)}')

Att.:
Marcelo Oliver



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts