При входе в ловушку EXIT
$?
содержит статус выхода. Это то же самое значение, которое вы найдете как $?
после вызова этого скрипта в другой оболочке :, либо аргумент, переданный в exit
(, усеченный до диапазона 0–255 ), либо состояние возврата предыдущей команды. В случае выхода из-за set -e
это статус возврата команды, которая вызвала неявный exit
.
Обычно следует сохранить $?
и снова выйти с тем же статусом.
cleanup () {
if [ -n "$1" ]; then
echo "Aborted by $1"
elif [ $status -ne 0 ]; then
echo "Failure (status $status)"
else
echo "Success"
fi
}
trap 'status=$?; cleanup; exit $status' EXIT
trap 'trap - HUP; cleanup SIGHUP; kill -HUP $$' HUP
trap 'trap - INT; cleanup SIGINT; kill -INT $$' INT
trap 'trap - TERM; cleanup SIGTERM; kill -TERM $$' TERM
Вам нужен список имен, которые вы хотите отслеживать. Либо вы ведете этот список вручную, либо извлекаете список из того места, где кто-то другой ведет список машин, которые должны работать.
Вы можете упростить несколько вещей. Команда ping
уже возвращает статус выхода, вы можете ее использовать. Также вам не нужно перенаправление для каждого эха, достаточно одного раза за цикл. Дополнительным преимуществом этого является то, что файл инициализируется и не содержит строк из последнего запуска.
for node in $(cat /tmp/node.txt); do
if ! ping -c 3 $node &> /dev/null; then
echo "$node"
fi
done > /tmp/nodedown.txt
Если вам нужна статистика, вы можете либо подсчитать их, либо использовать wc
для подсчета строк в двух файлах.
echo "$(wc -l < /tmp/nodedown.txt) / $(wc -l < /tmp/node.txt)"
Может быть, оператор случая:
#!/bin/sh
glob=${1:-*}
for node in `cat /tmp/node.txt`
do
case $node in
$glob) : ;;
*) continue ;;
esac
count=0
count=$(ping -c 3 $node | grep "100%packet loss"|wc -l)
if [ $count -ne 0 ]
then
echo "$node" >> /tmp/nodedown.txt
fi
done
Назовите это как:
nodecheck.sh 'bs381*'
Убедитесь, что регулярное выражение заключено в кавычки, чтобы оболочка не расширила его.