Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > PERL-скрипт для мониторинга и очистки памяти


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

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

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

Автор: amg 29.9.2009, 11:29
Цитата(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}



Автор: comhunt 29.9.2009, 12:41
Попробовал выполнить данный скрипт.
В логах ошибок выдало:

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

Пробела нет

Автор: comhunt 29.9.2009, 14:07
Еще один момент, который бы хотелось уточнить:

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

Но вот еще проблемка:
Я запуская данный скрипт из под пользователя, и естественно он мне выдает только процессы которые относятся к данному пользователю.
А мне нужно просмотреть все процессы которые есть в root.
Каким образом это возможно реализовать?

Автор: shamber 29.9.2009, 14:49
comhunt, sudo ?

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

Автор: gcc 30.9.2009, 00:42
comhunt, на FreeBSD можно поставить опцию одну в sysctl.con тогда все процессы будут видны из под пользователей

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)