#linux #bash #shell #variables #scripting
#linux #bash #оболочка #переменные #создание сценариев
Вопрос:
У меня есть рабочий скрипт, который выходит и проверяет, какие операционные системы запущены клиентом, а затем запускает код, относящийся к тому, который проверяет разницу в смещении NTP клиента относительно главного сервера.
Я хотел бы добавить в это некоторые записи ошибок, связанные с командами NTP, но не знаю, с чего начать. Любые указатели были бы весьма признательны.
#!/bin/bash
OS=`uname`
case $OS in
[Linux]*)
Host=`hostname`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date %D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo $Offset - $CADate | bc )
#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif
;;
[SunOS]*)
Host=`hostname`
Offset=`ntpq -p | tail -1 | awk '{print $9}'`
Date=`date %D`
CADate=`ntpdate -q 10.102.80.1 | tail -1 | awk '{print $10}'`
TimeDiff=$(echo $Offset - $CADate | bc)
#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif
;;
[AIX]*)
Host=`hostname -s`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date %D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo $Offset - $CADate | bc )
#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif
;;
esac
Комментарии:
1. В каком смысле регистрировать ошибки? Что такое «ошибка» в этом контексте?
2.
Any pointers would be greatly appreciated.
Начните с shellcheck.net3. @AndrewDorsett : Старый добрый
set -x
?
Ответ №1:
Важно понимать, что есть два вида ошибок:
- Вы запускаете команду UNIX / Linux, и это идет не так.
- Вы запускаете команду и видите результаты, которые вам не нравятся.
В первом случае результаты ошибок передаются в основной поток ошибок, известный как 1
. Ошибки можно перехватывать и записывать в файл журнала, вот так (я использую >>
, поскольку предпочитаю добавлять к файлу журнала, а не воссоздавать с нуля):
command 1>>logfile_error.txt
Для второго случая у вас есть что-то вроде:
bad_result=$(command)
// check that the result is bad indeed
bad_result >>logfile_error.txt
(Во втором случае основной поток ошибок не имеет непосредственного значения)
Очевидно, что вы можете объединить оба:
bad_result=$(command 1>>logfile_error.txt)
...
bad_result >>logfile_error.txt
Ответ №2:
В дополнение к перенаправлениям вывода вы можете условно решить, что должно быть записано / распечатано . .. поэтому вам может быть интересно использовать коды возврата, данные после выполнения команды, которые могут быть получены с помощью $?
https://www.tldp.org/LDP/abs/html/exit-status.html
https://www.tldp.org/LDP/abs/html/exit-status.html#FTN.AEN2981
просто пример использования:
(не совсем «хороший» — переписан в блокноте без дальнейшего тестирования, но все же может быть полезен для вас — могло бы быть лучше)
#!/bin/bash
Host=`hostname`
OS=`uname`
ntp_ip=10.102.80.1
Date=`date %D`
Offset_data=`ntpq -p`
Offset_rc=$? # you can a
if [[ $Offset_rc -ne 0 ]]; then
echo "Unable to.."
#exit $Offset_rc # - uncomment if you don't want to continue
# with the script if your ntp command failed
fi
CADate_data=`ntpdate -q $ntp_ip`
if [[ $? -ne 0 ]]; then # direct return code check
echo "Unable to..,"
fi
case $OS in
[Linux]*)
Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
;;
[SunOS]*)
Offset=`echo $Offset_data | tail -1 | awk '{print $9}'`
CADate=`echo $CADate_data | tail -1 | awk '{print $10}'`
;;
[AIX]*)
Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
;;
esac
TimeDiff=$(echo $Offset - $CADate | bc )
#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif