Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контроль процессов на линукс сервере, собственно как? :) 
V
    Опции темы
FishHunter
Дата 26.8.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 12.2.2009

Репутация: нет
Всего: нет



Добрый вечер,

Прошу совета общественности как решить следующую задачу:

На серваке запущено практически постоянно n-ое число процессов (назовем их wokers.pl). Некоторые из них "подвисают" и начинают хавать трафф, что не желательно. Я устал вручную тереть подвисшие процессы (смотрю top и у которых TIME+ больше чем мне надо тех убиваю, знаю извращение smile). Решил я написать скриптик, засунуть его в крон и пусть он эту работу делает за меня. Направьте на путь плиз.
ЗЫ Т.е. известно имена процессов, надо убивать те, TIME+ которых больше заданной мной величины.
ЗЫЫ Менять что-то в скриптах, которые рождают эти процессы нет никакого желания smile
PM MAIL   Вверх
amg
Дата 27.8.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Собственно, алгоритм действий Вы вполне исчерпывающе описали, остается только пересказать его на языке Perl smile :
Код
#!/usr/bin/perl

die "Usage: $0 process_name [max_TIME]\n" unless @ARGV;

$name = shift;
$time = shift || 60; # minutes

@pids = map {(split)[0]}
        grep {(split)[10]=~/^(\d+)/ && $1>=$time} 
        grep {/\b$name\b/} 
        `top -b -n1`;

#print "@pids\n";
kill 15, @pids;


PM MAIL   Вверх
FishHunter
Дата 27.8.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 12.2.2009

Репутация: нет
Всего: нет



сенькю вери мач smile
PM MAIL   Вверх
aksined
Дата 28.8.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.12.2005

Репутация: 1
Всего: 1



Код

@pids = map {(split)[0]}grep {(split)[10]=~/^(\d+)/ && $1>=$time} grep {/\b$name\b/} `top -b -n1`;


Есть несколько предложений
Одна и та же строка обрабатывается четыре раза. Причём два раза - абсолютно идентичным сплитом. В случае со списком процессов - это не имеет значения. А гигабайтные файлы лучше обрабатывать по-другому.

Код

#!/usr/bin/perl -w
use strict;

#регулярное выражение приведено для моего компьютера:
#[ 6219 sin       20   0  1772  536  436 S    0  0.0   0:00.00 compiz             ]
#[ 6376 sin       20   0 31004 9928 8232 S    0  0.5   0:00.04 evolution-excha    ]
#[ 6399 sin       20   0  1772  480  416 S    0  0.0   0:00.00 sh                 ]
#[ 6400 sin       20   0  1772  508  424 S    0  0.0   0:00.00 compiz-decorato    ]
#[ 6402 sin       20   0 19992  11m 7652 S    0  0.6   0:04.54 gtk-window-deco    ]

my $name = shift;
$name = qr/$name/; # пусть он скомпилируется один раз, а не в каждой итерации цикла
my @pids;
for(`top -b -n1`){
    chomp;
    if(/^ +(\d+)[^:]+(\d+:\d\d\.\d\d) $name/){
        if(){ # предлагаю проверку времени реализовать самостоятельно
            push @pids, $1;
        }
    }
}


Мне кажется, что лучше всё это хозяйство реализовать по-другому.
Во-первых, можно заметить по моему примеру, что длинные имена процессов порезались.
Во-вторых, если есть модуль, я правда не нашел, лучше пользоваться им.
В-третьих, вообще есть другая команда 
ps -eo pid,time,cmd
её вывод вообще распарсится вот так
($pid, $time, $cmd) = split / /,$_, 2; #команда может содержать пробел

Время надо поискать какое-то другое. То, что указал я, отличается от вазвращаемого командой top

Кроме того, так как запускаться будет из под cron-а, хорошо бы как-то логироваться - убился процесс/не убился

Это сообщение отредактировал(а) aksined - 28.8.2009, 16:01
PM MAIL   Вверх
amg
Дата 29.8.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(aksined @  28.8.2009,  15:59 Найти цитируемый пост)
А гигабайтные файлы лучше обрабатывать по-другому.
Совершенно согласен. И тогда (но только тогда) какие-либо, например, предлагаемые Вами оптимизации будут уместны (а начинать оптимизировать тогда уж нужно с замены системной команды в обратных кавычках, чтобы расход памяти уменьшить).

PM MAIL   Вверх
FishHunter
Дата 1.9.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 12.2.2009

Репутация: нет
Всего: нет



Благодарю за поправки, но то что предложил amg у меня прекрастно работает. Я дописал ещё пару строк, чтобы велись логи убитых процессов для полного контроля над ситуацией. В моём случае убивается по 2-3 процесса каждый час, поэтому мудрить больше не охота smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.