Я создал bash-скрипт, который работает как плагин Nagios. Вот его часть:
44 CURDUPLEX=`ethtool $IFACE|grep "Duplex"|cut -d ':' -f 2|xargs`
45 CURSPEED=`ethtool $IFACE|grep "Speed"|cut -d ':' -f 2|xargs|sed 's/.\{4\}$//'`
46
47 if [ $CURSPEED -eq $SPEED ]; then
48 if [ $CURDUPLEX = $DUPLEX ]; then
49 echo "OK: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex."
50 exit $OK
51 else
52 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s [OK] and $CURDUPLEX duplex (Expected $DUPLEX)."
53 exit $CRIT
54 fi
55 elif [ $CURDUPLEX = $DUPLEX ]; then
56 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex [OK]."
57 exit $CRIT
58 else
59 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex (Expected $DUPLEX)."
60 exit $CRIT
61 fi
62 }
Когда я запускаю его, я вижу ошибку:
]# ./check_physlink usage
./check_physlink: line 48: syntax error near unexpected token `then'
./check_physlink: line 48: ` if [ $CURDUPLEX = $DUPLEX ]; then'
Я думаю еще час и не могу понять, что не так. Подумал об отсутствии пробела между левой скобкой и знаком доллара, но, как видите, нет.
Пожалуйста, порекомендуйте. Спасибо.
Поскольку вы пишете для bash, вам действительно следует использовать [[, а не [, для тестов. О, и ИСПОЛЬЗУЙТЕ ЕЩЕ ЦИТАТЫ!
Вот некоторые руководства и записи часто задаваемых вопросов, которые помогут вам начать работу по улучшению скрипта:
Почему xargs
? Мне пришлось поискать его в спецификации POSIX, чтобы напомнить, что по умолчанию он echo
, но я редко вижу, чтобы это использовалось таким образом. На странице руководства Gnu об этом даже не упоминается.
44 CURDUPLEX=`ethtool $IFACE|grep "Duplex" ...`
45 CURSPEED=`ethtool $IFACE|grep "Speed" ...`
Вызов ethtool
дважды ставит под сомнение производительность Nagios.
Попробуйте что-нибудь вроде:
toolsays=$( ethttool $IFACE )
CURDUPLEX=$( echo "$toolsays" | grep Duplex ... )
CURSPEED=$( echo "$toolsays" | grep Speed ... )
Затем исходный сценарий отсекает последние четыре символа из скорости, но позже код по-прежнему принимает значение «Мбит / с». Сделайте это предположение явным, чтобы сценарий завершился ошибкой при обнаружении хоста, на котором ethtool не сообщает скорость в Мб / с.
Вы можете пойти еще дальше и заменить две функции конвейера, например:
function duplex_state { typeset toolsaid=$1 s=
: ${toolsaid:?}
s=${toolsaid##*Duplex: }
echo ${s%%$'\n'*}
}
function speed_value { typeset toolsaid=$1 s=
: ${toolsaid:?}
s=${toolsaid##*Speed: }
echo ${s%%Mb/s*}
}
И вот как вы их называете:
CURDUPLEX=$( duplex_state "$toolsays" )
CURSPEED=$( speed_value "$toolsays" )
Обратите внимание, как захваченный вывод из ethtool
по-прежнему необходимо заключать в кавычки, когда они не используются в присваивании, чтобы сохранить любые разрывы строк.