Bash: анализировать "реальный" вывод времени команды, проверять выходную строку, добавлять отметку времени и отправлять ее в выходной файл

Использование файла или стандартного ввода для настройки crontab вновь создает (перезаписывает )содержимое, а не добавляет к тому, что уже может существовать.

Одним из простых решений было бы записать каждую из ваших записей в один файл:

crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
    { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
    >> cron-entry-file

Затем, когда вы соберете все записи, сделайте это только один раз:

crontab -u root cron-entry-file

Если вы создаете свои записи в разных сценариях и/или в разное время, то каждый раз вам нужно будет выполнять:crontab -l > cron-entry-fileдля сохранения текущих настроек, затем выполните шаги, описанные выше. (Будем надеяться, что кто-нибудь предложит более изящное решение, но этот -метод грубой силы должен сработать.)


Редактировать

Поскольку ваш сценарий не так прост, как я думал, когда изначально писал вышеизложенное, рассмотрите возможность манипулирования файлом crontab напрямую. Это обычный файл (в каталоге /var/cron/tabs/{username}, например ). Возможно, стоит сначала прочитать это:https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually

1
01.08.2019, 22:50
2 ответа

Используйте /usr/bin/timeвместо оболочки, созданной -в time. Затем запишите stderrв отдельный файл из stdoutвашей команды application. Поскольку прошедшее реальное время является первым словом вывода time, его легко получить с помощью awk.

grepимеет переключатель -q, поэтому нет необходимости перенаправлять на /dev/null.

Наконец, sleepпринимает аргумент за секунды, поэтому я не думаю, что sleep 5mбудет делать то, что вы хотите. Однако синтаксис принят, поэтому я оставил его в силе.

for n in {1..1000}
do

    /usr/bin/time application login -u "user" \
             -p '******' "host.domain.com" > login.out 2>time.out

    realtime=$(awk '{print $1}' time.out)

    echo -n "$(date) real $realtime " >> output.txt

    if grep -q "Succeeded" login.out; then
        echo "Succeeded" >> output.txt
    else
        echo "Failed"   >> output.txt
    fi

    sleep 5m

done
1
28.04.2021, 23:30

Не выполняйте команду grep/awk/sed, просто используйте параметры формата времени, например. time -f "%e" commandвыведет только прошедшее реальное количество секунд, которое потребовалось команде, и ТОЛЬКО это.

1
28.04.2021, 23:30

Теги

Похожие вопросы