Executando o bash dentro do cronjob

Executando o bash dentro do cronjob

Eu tenho esse cronjob para rodar a cada minuto

*/1 * * * * root sh /test.sh

Meu /test.sh registra o resultado dos comandos "top" e "free". Funciona bem quando executo manualmente no terminal com "sh /teste.sh" e salva a saída em um arquivo legal, porém quando o cron job é executado ele salva apenas o resultado do comando "free" abaixo. Verifique isso por favor:

printf "\n" >> "log_lojar_top_free.txt"
printf %s "$(date)" >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
top -b -n 3 -d 1 | grep "Cpu" |  tail -n 1 | awk '/^%Cpu\(s\)/ {printf $2}' >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
free | awk '/^Mem:/ {printf $7}' >> "log_lojar_top_free.txt"

Qual é o erro que está fazendo com que apenas a última linha (livre) tenha sua saída registrada?

Responder1

Conforme sugerido por outros, tente usar diretamente o bash shebang em seu script ou prefixo usando bashem vez de sh. Pois não sei qual sistema você está realmente executando, recentemente tive problemas ao chamar um script usign /bin/sh -c myscript.shno ubuntu, que é um derivado do debian que usa dashem vez de bash.

Talvez esta seja a chave do seu problema.

EDIT: estou trabalhando com esta entrada crontab, feita como root com crontab -e:

*/1 * * * * /bin/bash -c "/test.sh"

Responder2

Esta versão funciona para mim. No entanto, como seu próprio script também funciona aqui, não tenho certeza se isso resolverá seu problema.

Entrada do crontab para todo o sistema (omita o rootcampo se este for o crontab do próprio root, acessado com crontab -e):

* * * * * root /root/test.sh

Pelo que pude determinar, seu script faz a terceira iteração tope coleta a porcentagem do modo de usuário da CPU. Ele também coleta o valor da memória em cache do arquivo free. Aqui dispensei freee extraí o mesmo valor da terceira iteração de top. Copie este script para /root/test.sh (e torne-o executável):

#!/bin/bash
top -b -n 3 -d 1 |
    awk -v date="$(date)" '
        /^%Cpu/ {cpu=$2}
        /cached Mem/ {cached=$9}
        END {printf "\n%s\t%s\t%s", date, cpu, cached}
    ' >> /root/log_lojar_top_free.txt

Torne o script executável:

chmod +x /root/test.sh

informação relacionada