
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 bash
em 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.sh
no ubuntu, que é um derivado do debian que usa dash
em 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 root
campo 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 top
e 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 free
e 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