Как отправить тело письма как сбойное, когда условие не выполняется?

С помощью procps-ng ps (должен быть стандартным в большинстве систем Linux) вы можете использовать -C параметр, чтобы ограничить вывод командами с определенным именем. Скорее всего, js-test-driver будет где-то в аргументах команды. Вы можете перечислить все аргументы для запуска java процессов с помощью:

ps -C java -o args=

Чтобы проверить js-test-driver в любом месте списка аргументов, вы можете сделать:

ps -C java -o args= | grep -q js-test-driver &&
  echo 'js-test-driver running'

Вы также можете используйте pgrep , эквивалент приведенного выше будет:

pgrep -f js-test-driver >/dev/null && echo 'js-test-driver running'

Обратите внимание, что если вы проверяете, запущен ли процесс, чтобы избежать одновременного запуска двух сценариев, есть еще надежные подходы, позволяющие избежать возможных условий гонки. См. Мой ответ здесь для примера подхода с использованием файла блокировки.

0
19.02.2019, 05:20
2 ответа

Для простоты делайте это поэтапно:

  1. Сохраните сообщение во временный файл.
  2. Проверьте, пусто ли сообщение.
  3. Действуйте надлежащим образом.
  4. Удалить временный файл.
#!/bin/sh

tmpfile=$(mktemp)

aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

if [ -s "$tmpfile" ]; then
    mail -s 's3' abc@gmail.com <"$tmpfile"
else
    mail -s 's3 (failed)' abc@gmail.com <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi

rm -f "$tmpfile"

Обратите внимание на другие внесенные изменения:

  1. Правильное цитирование s3:URI (содержит подстановку команд ).
  2. Вызов dateодин раз вместо трех раз (мог вызвать проблемы, если запускался в определенное время ).
  3. Использование -Feс grepдля сопоставления с использованием неизвестной строки.
  4. Правильно укажите сценарий awkи используйте OFS, чтобы установить разделитель полей вывода на табуляцию (для удобочитаемости ).

Для тех, кто не любит дублировать код(принцип "СУХОЙ" -):

#!/bin/sh

tmpfile=$(mktemp)

aws s3 ls "s3://project/js/Historical/$(date +'%Y/%m_%B/')" |
grep -Fe "$DATE" |
sort -rh |
head -n 2 |
awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

subject='s3'
if [ ! -s "$tmpfile" ]; then
    subject="$subject (failed)"
    cat >"$tmpfile" <<MESSAGE_END
Something failed.
You should check it.
MESSAGE_END
fi

mail -s "$subject" abc@gmail.com <"$tmpfile"
rm -f "$tmpfile"

В комментариях ищется решение, которое обрабатывает два вызова aws s3 ls.

Следующий код будет перебирать массив bashURI корзины, получать список каждого файла в отдельные временные файлы и вставлять пользовательское сообщение, когда конвейер awsприводит к пустому результату. В конце все сообщения объединяются и отправляются перед удалением.

#!/bin/bash

bucket=( "s3://project/js/Historical/$(date +'%Y/%m_%B/')" 
         "s3://some-other-path" )

msgfile=()
for uri in "${bucket[@]}"; do
    tmpfile=$(mktemp)

    msgfile+=( "$tmpfile" )

    aws s3 ls "$uri" |
    grep -Fe "$DATE" |
    sort -rh |
    head -n 2 |
    awk -v OFS='\t' '{ print $1, $2, $4 }' >"$tmpfile"

    if [ ! -s "$tmpfile" ]; then
        cat >"$tmpfile" <<MESSAGE_END
Something failed for bucket "$uri".
You should check it.
MESSAGE_END
    fi
done

cat "${msgfile[@]}" | 
mail -s 's3 file listings' abc@gmail.com

rm -f "${msgfile[@]}"

(не проверено)

1
28.01.2020, 02:41

Я считаю, что команда grep— это место, где вы хотите реализовать условие. Для этого можно использовать следующий синтаксис:

grep ${DATE} && : || echo "Fail"

Это конструкция bash, являющаяся укороченной версией стандартного оператора if..else..fi.

Идея здесь в том, что если grepнаходит совпадение, ничего не делать (с оператором :). Это позволит выходу grep перейти к следующей команде в конвейере.

Если grepне удалось найти соответствие из стандартного ввода, выведите строку «Fail».

Полный конвейер должен быть:

aws s3 ls s3://project/js/Historical/$(date +%Y)/$(date +%m)_$(date +%B/) | grep ${DATE} && : || echo "Fail" | sort -rh | head -n 2 | awk {' print $1"\t"$2"\t"$4'} | mail -s "s3" "abc@gmail.com"

Вы можете изменить строку вывода по мере необходимости, но вам необходимо убедиться, что она работает правильно со следующими командами в конвейере (sort, headиawk).

0
28.01.2020, 02:41

Теги

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