Понадобилось мониторить состояние сервера, точнее не всего сервера, а определенного демона, на сервере запускаемого. Понятно, что самым простым способом мониторинга чего-то работающего в фоне, является просмотр соответствующих логов. Но такой способ на самом деле дает весьма мало интерактивности, надо постоянно заходить по SSH, ковыряться в этих самых логах. Хочется, чтоб при изменении состояния, или же по определенной команде от определенного пользователя, сервер нам все рассказывал сам.
Хорошо, если демон умеет при изменении состояния запускать некие пользовательские скрипты. Так умеет, например, демон OpenVPN или, например, демон небольшой промышленной системы метеоконтроля, который я использовал в данном примере.
Вкратце, имеется плата на Arduino, обрабатывающая показания с нескольких датчиков и передающая их в удобоваримом формате через COM-порт демону, запущенному на сервере. Демон умеет исполнять пользовательские скрипты, но вот беда (та же беда и с OpenVPN), если в скрипте написать что-то типа echo "У нас изменились параметры, шеф, все пропало"
это сообщение в лучшем случае уйдет неведомо куда. В худшем — вылезет пользователю, из под которого стартует демон, посреди рабочего сеанса в консоль.
Самый простой способ всего этого избежать, при этом получив нужную интерактивность — отправлять сообщения определенному пользователю, созданному специально для данной цели.
Не так давно я делал похожего пользователя для отключения/перезагрузки сервера [КОПИЯ] . Фактически, пользователю была установлена псевдооболочка (на самом деле просто скрипт), выполняющий единственную команду перезагрузки/отключения системы. И идея создания псевдооболочек меня зацепила. Таким образом можно дать пользователю выполнять только ограниченный набор команд, да еще и обрабатывать параметры в скрипте по-своему, так что никакой злоумышленник, даже получив доступ по ssh ничего сделать не сможет, т.к. команды псевдооболочки ему неизвестны.
Почему бы не использовать такой способ и для целей мониторинга?
Первым делом создаем отдельную группу:
groupadd monusers
где monusers
— любое название группы на ваш вкус, ранее в системе не существующее
Создаем пользователя:
useradd -g monusers -d /home/meteomon -s /home/meteomon/monitor.sh meteomon
где:
-g monusers
группа пользователя (ранее созданная monusers
)
-d /home/meteomon
домашний каталог пользователя
-s /home/meteomon/monitor.sh
— псевдооболочка для пользователя, скрипт, обрабатывающий команды.
meteomon
— имя пользователя
Задаем пользователю пароль (иначе не сможем залогиниться по ssh):
passwd meteomon
Создаем домашний каталог:
mkdir /home/meteomon
Меняем владельца каталога на пользователя meteomon:
chown meteomon:monusers /home/meteomon
Меняем права доступа на каталог:
chmod 500 /home/meteomon
Создаем в домашнем каталоге скрипт monitor.sh
о содержимом скрипта ниже.
Меняем владельца и права доступа для скрипта monitor.sh
chown meteomon:monusers /home/meteomon/monitor.sh
chmod 500 /home/meteomon/monitor.sh
Поскольку пользователь предполагается исключительно для мониторинга, разрешим ему всего одну команду — выход из системы. Соответственно, скрипт будет такой:
#!/bin/bash echo "Hi, monitor operator" echo "To exit enter byebye" while [ "$KEYINPUT" != "byebye" ]; do read KEYINPUT done
Все просто — ввод с клавиатуры попадает в переменную KEYINPUT
и пока она не равна byebye
скрипт выполняется. Как только пользователь введет byebye
, так прервется цикл, скрипт завершит работу, и пользователь автоматически выйдет из системы.
Для отправки сообщений пользователю используем связку команд echo
и write
Можно создать отдельный скрипт со следующим содержимым:
#!/bin/bash
USERNAME="meteomon"
echo -e $1|write $USERNAME 2>/dev/null
положить его в каталог с доступными пользователям скриптами (например в /usr/sbin
) и установить права доступа, например в 755, чтобы пользователь для мониторинга мог получать сообщения от всех пользователей системы.
Примечание: параметр -e
команды echo
позволяет использовать специальные символы, такие, как перенос строки \n
, а конструкция 2>/dev/null
отправляет в нуль-устройство сообщение об ошибке, которое может возникнуть, если пользователь meteomon
не вошел в систему.
Осталось прописать соответствующую команду в пользовательском скрипте, вызываемом демоном, или исполняемом по cron’у:
...
DATA=`meteosrv checksystem`
/usr/sbin/techo $DATA
...
Внимание! Читайте документацию по демону, можно случайно нарваться на подводный камень, например, OpenVPN в некоторых случаях болезненно относится к ошибкам, случающимся в пользовательских скриптах.
Для Windows понадобится утилита plink
, обычно она идет вместе с ssh-клиентом PuTTY. В каталоге с ней создаем bat-файл следующего содержания.
testmon.bat:
plink -ssh -P 22 -l meteomon -pw meteomonpass 192.168.0.40
где вместо meteomon
надо подставить имя пользователя для мониторинга, вместо meteomonpass
— заданный пароль, а вместо 192.168.0.40
настоящий адрес удаленного компьютера.
Источники
Pingback: Более сложный способ мониторинга состояния сервера на Linux в реальном времени. | Персональный блог Толика Панкова