отслеживание процессов unix

 
0
 
Python
ava
larinva | 04.04.2011, 11:06
Всем привет!
Пишу скрип который отслеживает работу нужных мне процессов, так вот столкнулся с такой проблемой, а как реализовать с несколькими процессами. С одним делаю так:

#!/usr/bin/env python
import string

import commands, os, string

try:
#
httpd = commands.getoutput("ps ax|grep " + "httpd")
proginfo = string.split(httpd)
httpd = 'httpd'
for i in proginfo:
if httpd in i:
print "Process httpd", i
except:
print "There was a problem with the program."

Поделитесь своими соображениями, плиз!!! smile
Kommentare (34)
ava
larinva | 04.04.2011, 12:13 #
Народ, ну поделитесь мысля smile
ava
larinva | 04.04.2011, 21:27 #
есть кто живой smile
ava
bilbobagginz | 04.04.2011, 23:49 #
для начала скрип писАть переставай. начинай программы.
есть модуль psutil
а для многозадачности есть потоки, процессы...

ava
larinva | 05.04.2011, 07:25 #
системным администратором работаю, поэтому пока только скрипты, а за ответ спасибо!!!
ava
bilbobagginz | 06.04.2011, 23:37 #
Цитата (larinva @ 5.4.2011, 06:25 findReferencedText)
системным администратором работаю, поэтому пока только скрипты

отмазка не засчитана.
smile
скрипт - это тоже программа. и относиться надо соответственно - планировка, организация, и ревью и т.д.
ava
larinva | 07.04.2011, 07:58 #
точнее, что не так в моем скрипте?
ava
alexvs11 | 07.04.2011, 19:25 #
Цитата (larinva @ 4.4.2011, 10:06 findReferencedText)
Пишу скрип который отслеживает работу нужных мне процессов, так вот столкнулся с такой проблемой, а как реализовать с несколькими процессами.

1. что значит несколько процессов? если для например bash и sh - почему не вызвать два раза для разных (цикл типо)
2. почему не использовать pgrep?
ava
larinva | 08.04.2011, 07:35 #
alexvs11, чем же в данной ситуацииps хуже pgrep, тут уж дело вкуса кто к чему привык. Зачем два цикла если можно сделать в одном smile
Для тех кому не понятно
Цитата


1. что значит несколько процессов?


загляните сюда http://www.freebsd.org/doc/ru/books/handbo...-processes.html
ava
alexvs11 | 08.04.2011, 14:04 #
Цитата (larinva @ 8.4.2011, 07:35 findReferencedText)
загляните сюда http://www.freebsd.org/doc/ru/books/handbo...-processes.html

спасибо, ну раз вы такой продвинутый юзер, то советы должны тут вы давать smile
ava
larinva | 08.04.2011, 14:11 #
я вообще, то обратился сюда за советом, а не для издевок подобного рода smile
ava
bilbobagginz | 09.04.2011, 16:40 #
с т.з. количества системных процессов psutil работает с /proc, т.е. в одном процессе python.
это дешевле чем делать конвееры, ведь для мониторинга нередко хочется знать статус процесса, и др. данные (когда родился и т.д.).
запуск из питона такого чуда будет включать в себя: python, shell, ps, grep, cut, etc.

später ergänzt:
Цитата (larinva @ 4.4.2011, 09:06 findReferencedText)
  httpd = commands.getoutput("ps ax|grep " + "httpd"

баг же. сценарий:
1. имя процесса апача: httpd.
2. имя пользователя, под которым апач бежит: httpd
3. под этим пользователем бежит какой-то долгий cron job, для анализа логов, их переноса и т.д. и в командной строке присутствует параметр httpd.

крон запускает задачу в 2:00 ночи.

в 1:59 процесс апача умер. в 2:30 твой скрипт обнаруживает процесс по формуле....
и ты не узнаешь что апач умер, пока первый пользователь не позвонит в тех-поддержку.
ava
larinva | 13.04.2011, 13:41 #
Спасибо bilbobagginz, за подробное разъяснение, как же тогда должен выглядеть скрипт с использование psutil, если не сложно скиньте примерчик smile
ava
bilbobagginz | 15.04.2011, 09:15 #
Цитата (larinva @ 13.4.2011, 12:41 findReferencedText)
как же тогда должен выглядеть скрипт с использование psutil, если не сложно скиньте примерчик

т.е. для начала - импорт модуля

import psutil

для безопасности от race по процессам надо гулять при помощи psutil.process_iter()
при запросе о процессах ты получаешь элемент класса Process.
которой описывает данные о процессе из таблицы процессов.
выбор надо делать по нужным тебе параметрам, т.е. комбинации: имени пользователя и имени процесса (или другим данным, как тебе надо)
разница с грепом вопиюща: когда ты делаешь греп, то поиск идет по всем словам строки.
тут у тебя полный контроль. как в бд.
напр. если тебе надо сделать "выборку" типа cmdline - запуск апача, который принадлежит www-data, то:

def get_procs_by_cmd_and_user(c,u)
result = []
for p in psutil.process_iter():
if p.cmdline[0] == c and p.username == u:
result.append(p)
return result

def get_apaches_on_debian():
return get_procs_by_cmd_and_user('/usr/sbin/apache2', 'www-data')

def get_apaches_on_rhel():
return get_procs_by_cmd_and_user('/usr/sbin/httpd', 'apache')

my_apaches = get_apaches_on_debian()
print my_apaches

остальное - кого убивать и т.д., это уже думай сам. читай доки функций psutil, там есть всё что тебе надо.
ava
larinva | 18.04.2011, 12:58 #
запускаю этот скрипт в FreeBsd 8.1 выводит процессы


import psutil

names = set(x.name for x in psutil.get_process_list())
process = set(['httpd', 'squid'])
try:
for p in process:
if p in names:
print names

except psutil.error.NoSuchProcess:
pass


А если запускаю в FreeBsd6.2 то вот это

Traceback (most recent call last):
File "./_proc.py", line 23, in <module>
names = set(x.name for x in psutil.get_process_list())
File "./_proc.py", line 23, in <genexpr>
names = set(x.name for x in psutil.get_process_list())
File "/usr/local/lib/python2.6/site-packages/psutil/__init__.py", line 162, in name
name = self._platform_impl.get_process_name()
File "/usr/local/lib/python2.6/site-packages/psutil/_psbsd.py", line 72, in wrapper
raise NoSuchProcess(self.pid, self._process_name)
psutil.error.NoSuchProcess: process no longer exists (pid=34284)

подскажите что нужно сделать чтобы от этого избавиться
ava
bilbobagginz | 18.04.2011, 21:52 #
larinva, psutil.get_process_list() дает одноразовый список. судя по мануалу модуля его нельзя использовать в цикле:
я же написал примерчик. пользуйтеся.
АЛСО, надо бы прострелить версии питона - может у psutil есть требования...

ava
larinva | 19.04.2011, 08:16 #
bilbobaggin, странно, но в Freebsd8.1 и windowsXP работает и со списками и в цикле, а ваш пример выдает следующее


Traceback (most recent call last):
File "./_proc.py", line 58, in <module>
my_apaches = get_apaches_on_debian()
File "./_proc.py", line 53, in get_apaches_on_debian
return get_procs_by_cmd_and_user('/usr/local/sbin/httpd', 'www')
File "./_proc.py", line 48, in get_procs_by_cmd_and_user
if p.cmdline[0] == c and p.username == u:
IndexError: list index out of range

А что значит
Цитата


АЛСО, надо бы прострелить версии питона

, поясните если не сложно
ava
bilbobagginz | 19.04.2011, 09:02 #
Цитата (larinva @ 19.4.2011, 07:16 findReferencedText)
, поясните если не сложно

если мы говорим о "кошерном" Python с сайта python.org,
есть много версий: 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2
но есть еще несколько версий - Iron Python, Jython, и т.п.
между ними есть разница в:
  • багах
  • поддерживаемых фичах
  • синтаксисе языка (больше PEPов поддеживается в наиболее последних стабильных)
в доках модуля обычно пишут под каким питоном и в каких средах его тестировали.
иногда вне этих сред модуль не работает :)

(оставим более грустные случаи, когда и в "поддерживаемых" средах модуль ведет себе некорректно)

идея "почему же оно не работает" интуитивно:
возможно в новых версиях FreeBSD внесли какую-то подсистему слежения за проциками, которой в предыдущих не было.
напр. какое-то расшрирение /proc а ля Линух.

при достаточно старой системе + питоне наверное программу надо затачивать под старую систему (a.k.a. допиливать), напр. проверять на пустые уже мертвые процессы, как вы начали делать в предыдущей реинкарнации программы

ну и мы еще не прострелили, что используется одна и та же версия самого модуля psutil.
ava
larinva | 19.04.2011, 09:11 #
сейчас установлен python2.5 установил psutil-0.2.1.tar.gz Sources (working with python from 2.4 to 3.2)
ava
bilbobagginz | 19.04.2011, 21:11 #
ok, перечитал доку smile
итератор более безопасен с т.з. race conditions, но исключение о том, что процесс уже умер может произойти.
ava
larinva | 20.04.2011, 09:44 #
))) что мне делать то? smile
ava
bilbobagginz | 21.04.2011, 10:53 #
larinva, оставить меня в покое. (опционально: сказать "спасибо")
удачи.
ava
larinva | 22.04.2011, 15:34 #
сп-бо за полезные советы и разъяснения bilbobagginzsmile
ava
larinva | 27.04.2011, 09:54 #
Тема может быть закрыта сделал update freebsd и все заработало
ava
larinva | 28.04.2011, 13:38 #
не долго пришлось радоваться прошло 3-4 часа после перезагрузки сервера все повторилось smile
ava
bilbobagginz | 29.04.2011, 10:38 #
larinva,
перечитай ВСЕ мои посты этой ветки внимательно, особенно на предмет чем НЕ пользоваться.
если ты продолжаешь запускать скрипт с вызовом get_process_list(), пеняй на себя.
ava
larinva | 29.04.2011, 10:44 #
при таком вызове psutil.process_iter() тоже самое
ava
bilbobagginz | 29.04.2011, 10:57 #
Цитата (larinva @ 29.4.2011, 09:44 findReferencedText)
при таком вызове psutil.process_iter() тоже самое

чего-то я торможу: ошибка в строке, где p уже известен.
моя бага (это был изначально черновик)
правильнее будет проверить сначала на пользователя, и убедиться в том, что cmdline - это список
(может это какой-то ядренный процесс без строки.)

def get_procs_by_cmd_and_user(c,u)
result = []
for p in psutil.process_iter():
if p.username != u:
continue
if p.cmdline.__class__ != list:
if p.cmdline != c:
continue
elif p.cmdline[0] != c:
continue
result.append(p)
return result
ava
larinva | 05.05.2011, 11:15 #
вообщем тоже самое

process.py
Traceback (most recent call last):
File "./process.py", line 18, in <module>
get_procs('/usr/local/sbin/httpd', 'www')
File "./process.py", line 8, in get_procs
if p.username != u:
File "/usr/local/lib/python2.7/site-packages/psutil/__init__.py", line 218, in username
return pwd.getpwuid(self.uid).pw_name
File "/usr/local/lib/python2.7/site-packages/psutil/__init__.py", line 204, in uid
return self._platform_impl.get_process_uid()
File "/usr/local/lib/python2.7/site-packages/psutil/_psbsd.py", line 72, in wrapper
raise NoSuchProcess(self.pid, self._process_name)
psutil.error.NoSuchProcess: process no longer exists (pid=37809)
ava
bilbobagginz | 07.05.2011, 13:15 #
larinva, да. надо добавить в цикл

try:
# тут все if-ы.
except psutil.error.NoSuchProcess, e:
continue

ведь процессы могут умереть после того как их "посчитали" в списке.

ava
larinva | 07.05.2011, 17:22 #
get_procs_by_cmd_and_user(c,u) какой бы процесс не проверял всегда выдает сообщение процесс больше не существует
ava
bilbobagginz | 07.05.2011, 17:52 #
larinva, не знаю.
у меня все работает. на дебиан/редхат.
найми себе программиста он тебе даст решение из коробки. я занят.

smile
ava
larinva | 07.05.2011, 21:37 #
bilbobagginz ог smile ромное тебе человеческое сп-бо smile smile smile на freebsd 8.2 тоже все ок а вот 6.4 такая херь smile , еще раз smile и с праздником !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
ava
larinva | 07.05.2011, 21:58 #
обращение к народу, может у кого-то есть freebsd 6.4, и он попробует запустить этот скрипт? отзовитесь
ava
larinva | 24.05.2011, 14:05 #
тема может быть закрыта, сам разобрался!!!
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
Ähnliche
advanced
Absenden