Запуск bash внутри cronjob

Запуск bash внутри cronjob

У меня есть cronjob, который запускается каждую минуту

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

Мой /test.sh регистрирует результат команд "top" и "free". Он отлично работает, когда я запускаю его вручную на терминале с помощью "sh /teste.sh" и сохраняет вывод в файл nice, однако, когда запускается задание cron, он сохраняет только результат команды "free" ниже. Проверьте это, пожалуйста:

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"

В чем заключается ошибка, из-за которой регистрируется вывод только последней строки (свободной)?

решение1

Как предлагают другие, попробуйте напрямую использовать bash shebang в вашем скрипте или префиксе, используя bashвместо sh. Поскольку я не знаю, какую систему вы на самом деле используете, я недавно столкнулся с проблемой вызова скрипта usign /bin/sh -c myscript.shв Ubuntu, который является производным от Debian, который использует dashвместо bash.

Возможно, это ключ к вашей проблеме.

EDIT: У меня все заработало с этой записью в crontab, сделанной как root с помощью crontab -e:

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

решение2

Эта версия работает у меня. Однако, поскольку ваш собственный скрипт тоже работает здесь, я не совсем уверен, что это решит вашу проблему.

Запись общесистемного crontab (пропустите rootполе, если это собственный crontab пользователя root, доступ к которому осуществляется с помощью crontab -e):

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

Насколько я могу определить, ваш скрипт берет третью итерацию из topи собирает процент CPU usermode. Он также собирает значение кэшированной памяти из free. Здесь я обошелся без freeи извлек то же значение из третьей итерации top. Скопируйте этот скрипт в /root/test.sh (и сделайте его исполняемым):

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

Сделайте скрипт исполняемым:

chmod +x /root/test.sh

Связанный контент