С помощью 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'
Обратите внимание, что если вы проверяете, запущен ли процесс, чтобы избежать одновременного запуска двух сценариев, есть еще надежные подходы, позволяющие избежать возможных условий гонки. См. Мой ответ здесь для примера подхода с использованием файла блокировки.
Для простоты делайте это поэтапно:
#!/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"
Обратите внимание на другие внесенные изменения:
s3:
URI (содержит подстановку команд ). date
один раз вместо трех раз (мог вызвать проблемы, если запускался в определенное время ). -Fe
с grep
для сопоставления с использованием неизвестной строки. 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
.
Следующий код будет перебирать массив bash
URI корзины, получать список каждого файла в отдельные временные файлы и вставлять пользовательское сообщение, когда конвейер 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[@]}"
(не проверено)
Я считаю, что команда 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
).