Executando bash dentro do cronjob

1

Eu tenho este cronjob para executar everyminute

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

Meu /test.sh registra o resultado do comando "top" e "free". Ele funciona bem quando eu o executo manualmente no terminal com "sh /teste.sh" e salva a saída em um arquivo legal, no entanto, quando a tarefa do cron é executada, apenas salva 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"

O que está errado em fazer apenas a última linha (livre) para ter sua saída registrada?

    
por Samul 30.10.2015 / 23:46

2 respostas

1

Como sugerido por outros, tente direcionar o uso do bash shebang em seu script ou prefixo usando bash em vez de sh . Pois eu não sei qual sistema você está realmente rodando, eu recentemente tive problemas ao chamar um script usign /bin/sh -c myscript.sh no ubuntu que é um derivado do Debian que usa dash ao invés de bash .

Talvez esta seja a chave para o seu problema.

EDIT: Eu tenho que trabalhar com esta entrada crontab, feito como root com crontab -e :

*/1 * * * * /bin/bash -c "/test.sh"
    
por 04.11.2015 / 00:19
0

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 crontab em todo o sistema (omita o campo root se este for o crontab da própria raiz, conforme acessado com crontab -e ):

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

Tanto quanto eu posso determinar, seu script pega a terceira iteração de top e coleta a porcentagem de modo de usuário da CPU. Ele também coleta o valor da memória em cache de free . Aqui eu 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
    
por 04.11.2015 / 00:11