Изменение имени процесса с помощью Shell для мониторинга nagios с помощью check_procs - PullRequest
3 голосов
/ 25 января 2012

У меня есть скрипт Python для запуска процесса, который я хочу отслеживать с помощью Nagios. Когда я запускаю этот скрипт и выполняю ps -ef на моем экземпляре Ubuntu EC2, он показывает процесс как python <filename>.py --arguments. Чтобы Nagios мог контролировать этот процесс с помощью check_procs, нам нужно указать имя процесса. Здесь имя процесса становится «питоном».

/usr/lib/nagios/plugins/check_procs -C python

Возвращает вывод, что запущен один процесс python. Это нормально, когда я запускаю один процесс Python. Но если я запускаю несколько сценариев Python и наблюдаю только за несколькими, то я должен дать это имя конкретному процессу. Если в приведенной выше команде я даю имя скрипта Python, он выдает ошибку. Поэтому я хочу замаскировать целое python <filename>.py --arguments под другим именем, чтобы при выполнении check_procs я мог дать это новое имя.

Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать. Я проверил другие вопросы, связанные с изменением стека, которые предлагают изменить имя процесса Python с помощью setproctitle, но я хочу выполнить это с помощью оболочки.

С уважением,

Sanket

Ответы [ 6 ]

4 голосов
/ 28 февраля 2012

Вы можете использовать команду check_procs для просмотра аргументов, которые включают имя модуля.Следующая команда сообщит вам, работает ли модуль python 'module.py'.

/usr/lib/nagios/plugins/check_procs -c 1:1 -a module.py -C python

Аргумент -c позволяет вам установить критический диапазон.1: 1 вызовет критическое состояние, если запущено больше или меньше 1 процесса.

Аргумент -a будет фильтровать на основе процессов, содержащих аргументы module.py (измените его наимя модуля, который вы хотите отслеживать)

Аргумент -C будет гарантировать, что этот процесс является процессом Python

Если вам нужна помощь в выяснении того, как создать определение службы, у меня былочтобы понять это тоже.Просто дайте мне знать.

СПРАВКА: man-плагин check_procs http://nagiosplugins.org/man/check_procs

2 голосов
/ 25 января 2012

Вы не можете изменить имя процесса на чистый Python, хотя вы можете использовать для этого оболочку (например, написанную на C).

Однако вместо этого вы должны сделать свою программу демоном и использовать pidfile. Взгляните на python Daemon API и его реализацию python-daemon .

1 голос
/ 19 апреля 2012

check_procs уже обрабатывает эту ситуацию.

check_procs может определить разницу между сценариями, запускаемыми как аргумент интерпретатора, по сравнению с заданиями, запускаемыми непосредственно интерпретатором hashbang. Хотя оба они выглядят одинаково в выводе PS! Последний случай не будет указан в check_procs -C python!

Если вы запускаете свои скрипты явно через python: python <filename.py>, то вы можете контролировать их с помощью check_procs -C python -a filename.py.

Если вы добавите #!/usr/bin/python в свои скрипты и запустите их как ./filename.py, то вы можете контролировать с помощью check_procs -C filename.py.

Пример сеанса командной строки, показывающий это поведение:

#make test.py directly executable.  See code below
$ chmod a+x test.py

#launch via python explicitly:
$ /usr/bin/python ./test.py &
[1] 27094
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 1 process with command name 'python'
PROCS OK: 0 processes with command name 'test.py'
PROCS OK: 1 process with args 'test.py'

#launch via python implicitly
$ ./test.py &
[2] 27134
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 1 process with command name 'python'
PROCS OK: 1 process with command name 'test.py'
PROCS OK: 2 processes with args 'test.py'

#PS 'COMMAND' output looks the same
$ ps 27094 27134
  PID TTY      STAT   TIME COMMAND
27094 pts/6    S      0:00 /usr/bin/python ./test.py
27134 pts/6    S      0:00 /usr/bin/python ./test.py

#kill the explicit test
$ kill 27094 
[1]  - terminated  /usr/bin/python ./test.py                                                                           
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 0 processes with command name 'python'
PROCS OK: 1 process with command name 'test.py'
PROCS OK: 1 process with args 'test.py'

#kill the implicit test
$ kill 27134
[2]  + terminated  ./test.py                                                                                           
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 0 processes with command name 'python'
PROCS OK: 0 processes with command name 'test.py'
PROCS OK: 0 processes with args 'test.py'

test.py - это скрипт на python, который спит 2 минуты. Это chmod + x и строка хеш-бэнга #!, вызывающая /usr/bin/python.

#!/usr/bin/python
import time
time.sleep(120)
0 голосов
/ 26 января 2012

Вы можете использовать subprocess.Popen , чтобы изменить имя исполняемого файла, но вам придется использовать скрипт-обертку (или какую-то странную магию форка).Следующий код заставляет ps выводить исполняемый файл как kwyjibo /tmp/test.py вместо /usr/bin/python /tmp/test.py:

import subprocess
p = subprocess.Popen(['kwyjibo', '/tmp/test.py'], executable='/usr/bin/python')
0 голосов
/ 25 января 2012

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

ln -s `which python` ~/mypython
~/mypython myscript.py

Скрипты, запущенные по ссылке, должны отображаться как mypython в ps.

0 голосов
/ 25 января 2012

Создайте файл pid и используйте этот файл для поиска процесса с помощью nagios.

...