Ejecutando bash dentro de cronjob

Ejecutando bash dentro de cronjob

Tengo este cronjob para ejecutar cada minuto

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

Mi /test.sh registra el resultado del comando "superior" y "libre". Funciona bien cuando lo ejecuto manualmente en la terminal con "sh /teste.sh" y guarda el resultado en un archivo agradable; sin embargo, cuando se ejecuta el trabajo cron, solo guarda el resultado del comando "gratis" a continuación. Comprueba esto 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"

¿Cuál es el error que está causando que solo se registre la salida de la última línea (libre)?

Respuesta1

Como lo sugirieron otros, intente utilizar directamente el bash shebang en su secuencia de comandos o el prefijo usando en bashlugar de sh. Como no sé qué sistema estás ejecutando realmente, recientemente tuve problemas para llamar a un script usign /bin/sh -c myscript.shen ubuntu, que es un derivado de Debian que usa dashen lugar de bash.

Quizás esta sea la clave de tu problema.

EDITAR: lo tengo funcionando con esta entrada de crontab, hecha como root con crontab -e:

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

Respuesta2

Esta versión me funciona. Sin embargo, como su propio script también funciona aquí, no estoy del todo seguro de que esto solucione su problema.

Entrada crontab de todo el sistema (omita el rootcampo si se trata del crontab propio de root, al que se accede con crontab -e):

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

Hasta donde puedo determinar, su secuencia de comandos toma la tercera iteración topy recopila el porcentaje del modo de usuario de la CPU. También recopila el valor de la memoria caché de free. Aquí prescindí freey extraje el mismo valor de la tercera iteración de top. Copie este script a /root/test.sh (y hágalo ejecutable):

#!/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

Haga que el script sea ejecutable:

chmod +x /root/test.sh

información relacionada