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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PERL-скрипт для мониторинга и очистки памяти, PERL-скрипт для мониторинга и очистки па 
:(
    Опции темы
comhunt
Дата 29.9.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не всегда бывает просто отследить причину утечки памяти порождаемых PERL-сценариями. Но, как я понимаю, можно устранять последствия подобных утечек за счет постоянного мониторинга ситуации. У меня появилась идея написать PERL-скрипт, который бы это делал. Но для его написания необходимо последовательно решить несколько задач:

1.    Просмотреть результат системно ps или top и поместить их в массив хешев, который бы имел следующие значения ключей:
PID  
Пользователь  
Процессор %  
Память (Mb)  
Время работы  
Команда
2.    Сделать цикл по данном массиву, выбирая те процессы, у которых значения «Память (Mb)» и «Процессор %» больше максимально допустимых, которые я сам могу задать в зависимости от ситуации.
3.    Взять все выбранные процессы и убить их.
4.    Повесить данный скрипт на крон, чтобы он каждую минуту запускался и чистил память.

В общем-то, идея достаточно прозрачна, с пунктами 2 и 4 проблем нет – там все тривиально для меня. Но я не знаю, как практически реализовать пункт 1,3.

PM MAIL   Вверх
amg
Дата 29.9.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(comhunt @  29.9.2009,  09:20 Найти цитируемый пост)
Но я не знаю, как практически реализовать пункт 1,3.
Например, так (п.1):
Код
my (@array, @keys);
foreach (`top -b -n1`) {
  chomp;
  @keys = split if m/^\s*PID/;
  if (m/^\s*\d/) {
    die unless @keys;
    my %h;
    @h{@keys} = split ' ', $_, $#keys+1;
    push @array, \%h;
  }
}

my @some_keys = qw(PID USER %CPU %MEM    TIME+  COMMAND);
die "Bad @some_keys\n" if grep {! exists $array[0]{$_}} @some_keys;

print join("\t", @some_keys), "\n";
foreach (@array) {
  my %h = %$_;
  print join("\t", @h{@some_keys}), "\n";
}
п.3 (убивать) :
Код
kill 15, $array[$n]{PID}



PM MAIL   Вверх
comhunt
Дата 29.9.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал выполнить данный скрипт.
В логах ошибок выдало:

top: illegal option -- 1                                                  
Top version 3.5beta12                                                     
Usage: top [-abCHIijnPqStuv] [-d count] [-m io | cpu] [-o field] [-s time]
       [-U username] [number]                                             
Bad PID USER %CPU %MEM TIME+ COMMAND

Добавлено через 10 минут и 25 секунд
А... кажется доперло...
 -n1
Должно быть или -n или -n 1

Пробела нет
PM MAIL   Вверх
comhunt
Дата 29.9.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще один момент, который бы хотелось уточнить:

Со скриптом вроде разобрался - переделал под себя.

Но вот еще проблемка:
Я запуская данный скрипт из под пользователя, и естественно он мне выдает только процессы которые относятся к данному пользователю.
А мне нужно просмотреть все процессы которые есть в root.
Каким образом это возможно реализовать?
PM MAIL   Вверх
shamber
Дата 29.9.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



comhunt, sudo ?

Это сообщение отредактировал(а) shamber - 29.9.2009, 14:49
PM MAIL Jabber   Вверх
amg
Дата 29.9.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(comhunt @  29.9.2009,  14:07 Найти цитируемый пост)
Я запуская данный скрипт из под пользователя, и естественно он мне выдает только процессы которые относятся к данному пользователю.
Почему естественно? У меня top выдает все процессы. Другое дело, что убить смогу только свои.

PM MAIL   Вверх
gcc
Дата 30.9.2009, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



comhunt, на FreeBSD можно поставить опцию одну в sysctl.con тогда все процессы будут видны из под пользователей
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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