Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Процессы в Linux

PSMon: приручаем демонов

Оригинал: Taming your daemons with PSMon
Автор: Ben Martin
Дата: 2 сентября 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 30 сентября 2008

С помощью утилиты PSMon системный администратор может указывать, какие процессы должны быть запущены, сколько они должны потреблять времени процессора или памяти и сколько экземпляров процессов может быть запущено. Работа PSMon гарантирует, что эти процессы будут работать в постоянном режиме, а при превышении положенных им ресурсов будут убиты, либо перезапущены при появлении критических ошибок.

PSMon нет в репозиториях дистрибутивов Fedora 9, Ubuntu Hardy или openSUSE 11. Установить PSMon можно с помощью утилиты CPAN - описание этой процедуры можно найти в руководстве PSMon. В подкаталоге support утилиты лежит установочный скрипт, который возьмет всю рутинную работу на себя.

Для работы PSMon потребуется несколько Perl-модулей. Установить их можно с помощью скрипта support/install.sh, либо вручную из репозиториев вашего дистрибутива. Преимуществом последнего варианта является то, что у вас будут установлены пакеты, полностью совместимые с вашим дистрибутивом Linux. Указанные ниже команды как раз устанавливают эти модули Perl, а затем запускается установочный скрипт install.sh:

# yum install perl-CPAN perl-YAML
# yum install perl-Config-General perl-Proc-ProcessTable perl-Unix-Syslog
# tar xjf psmon-1.29.tar.bz2
# cd psmon*
# ./support/install.sh
Checking for Config::General ... found
Checking for Proc::ProcessTable ... found
Checking for Unix::Syslog ... found
Checking for Getopt::Long ... found
Installing psmon ... done
Installing psmon-config ... done
Installing etc/psmon.conf ... done
Generating HTML documentation support/psmon.html ... done
Installing manual psmon.1 ... done

Скрипт создаст конфигурационный файл, содержащий пары "ключ-значение" как глобальные переменные, либо как вложенные в группы Process. Синтаксис очень похож на синтаксис конфигурационных файлов Apache. Есть специальная группа Process *, параметры в которой будут применяться ко всем процессам. Однако это может сработать не так, как вы предполагаете - к примеру, будут уничтожаться те процессы, которые вы убивать не желаете. В общем, нужно остерегаться использования группы Process *. Ближе к началу файла /etc/psmon.conf вы увидите параметр Disabled True, который нужно будет включить, как только вы все настроите. До этого момента PSMon будет простаивать.

Помимо этих в PSMon есть еще несколько директив, предназначенных для использования на верхнем уровне, вне групп Process. С их помощью можно установить промежуток времени (в секундах, значение по умолчанию - 60), через который PSMon будет сканировать таблицу процессов. Если сменить это значение на 5, тогда плохо работающие процессы будут убиваться быстрее, однако в этом случае сам PSMon будет потреблять больше процессорного времени. Директива AdminEmail (по умолчанию root@localhost) указывает электронную почту, на которую PSMon будет слать сообщения о созданных или убитых процессах, а также ошибки.

Есть еще две директивы NeverKillPID и NeverKillProcessName, которые указывают на то, что конкретные процессы нельзя убивать. После директивы указывается соответственно список Process ID (PID), разделенный пробелами (по умолчанию стоит 1 - PID процесса init), и список процессов ядра, которые не хотелось бы убивать по ошибке.

В следующем примере показана группа Process, обрамленная в XML-подобные теги. После объявления Process нужно записать имя интересующего процесса. Здесь следует писать именно имя процесса, безо всяких путей, опций командной строки и т.п. Было бы здорово, если бы разработчики добавили возможность указывать путь (или даже регулярное выражение), с которого запускается процессс. К примеру, возьмем демон SSH. Буквальная запись sshd вряд ли приведет к ложным срабатываниям на других процесссах. В этом примере группа sshd обеспечивает непрерывную работу демона SSH, вопреки всяким падениям и ошибкам.

<Process sshd>
    SpawnCmd /sbin/service sshd start
</Process>

В группе Process можно использовать и другие директивы, среди которых Instances - для ограничения сверху количества работающих процесов, и KillCmd - предоставляющий пользователю самому выбирать команду для закрытия некорректно работающего процесса. Если KillCmd не указан, процессу будет послан стандартный сигнал SIGKILL. Возможно, вы захотите сначала послать SIGTERM процессу, подождать несколько секунд, а затем (если процесс так и остался висеть) послать более сильный сигнал SIGKILL - это можно реализовать с помощью директивы KillCmd. Удобно в директиве KillCmd записывать указания на скрипты из каталога /etc/init.d.

С помощью директив PctCPU, PctMEM и TTL можно установить ограничение на используемые процессом долю процессора, памяти и установить общее время жизни. Директива PIDFile говорит PSMon о том, где находится файл, содержащий PID демона, который не следует убивать. Эта директива полезна лишь в связке с PctCPU, PctMEM и TTL. Рассмотрим ситуацию, в которой возможно применение директивы PIDFile. К примеру, у вас есть демон, порождающий множество дочерних процессов, предоставляющих какой-либо сетевой сервис. Далее, вам хочется, чтобы дочерние процессы не расходовали более 70% оперативной памяти. С помощью директивы PIDFile можно дать указание PSMon о том, чтобы убивая дочерние процессы (растрачивающие память), он не убивал основной процесс.

Директива TTL полезна в том случае, когда нужно ограничить срок жизни процесса. Например, вам заведомо известно, что команды updatedb, unison или find не должны выполняться, скажем, более одного часа. Тогда можно ограничить их выполнение следующей записью:

<Process find>
    ttl 3600 instances 30
</Process>

"Разговорчивость" PSMon можно ограничивать с помощью директив NoEmail, NoEmailOnKill и NoEmailOnSpawn. По умолчанию все эти значения равны False, но после установки True-значений PSMon перестает слать почту во всех случаях, в случае убиения процесса и его порождения соответственно.

Можно применять директивы LogLevel и AdminEmail внутри каждой секции, таким образом возможно, к примеру, посылать почту через SMS-шлюз в случае важного события, например, падения сервера Apache.

Если послать сигнал USR1 работающему демону PSMon, это приведет к повторному сканированию списка работающих процессов. Запуск PSMon в режиме демона осуществляется помощью ключа --daemon.

Заключение

Мне не очень нравится идея убивать процесс, если он занимает много процессорного времени, к примеру 95% в течение нескольких минут - вполне возможно, он выполняет нечто дельное, и убивать его совсем не нужно. Однако в связке с ограничением по времени жизни (TTL), можно вполне защитить свои сервера от плохо работающих задач, запущенных через cron, в автоматическом режиме, когда такие неприятности трудно заметить. Возможность восстанавливать процессы, если какие-то из них отказали - это определенно полезная функция. Хотя sshd и Apache не замечены в частых падениях, но все равно это когда-нибудь да может произойти. Итак, PSMon - ценная утилита в комплекте системного администратора.