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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получить время работы процесса, операционная система fedora 
:(
    Опции темы
debugg
  Дата 27.8.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня такая проблема. Хочу узнать сколько времени проработал определенный процесс и если время больше заданного вырубить его. Задача вроде бы тривиальная и должна много где использоваться хотя в сети найти ничего стоящего не могу.
    Процессы по заданному условию я отловил используя псевдо-файловую систему /proc. Там у каждого процесса есть дерриктория в которой лежит файлик stat содержащий все необходимые данные. Вот вопрос как определить какие из этих цифр являються временем работы процесса. Конкретно мне нужно поле START которое выводиться при комманде PS -eux, вернее его данные.
    Если кто сталкивался помогите плз...
PM MAIL   Вверх
amg
Дата 27.8.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Можно, конечно, самому парсить /proc, но проще воспользоваться готовым модулем. Например
Код

use Proc::ProcessTable;
$now = time();
$t = new Proc::ProcessTable;
foreach $p ( @{$t->table} ){
  if (getpwuid($p->uid) eq 'user' and $now - $p->start > 24*3600) {
    print $p->pid, "\t", $p->fname, "\n";
    #$p->kill(9);
  }
}


PM MAIL   Вверх
debugg
Дата 27.8.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



эх если бы был Proc::ProcessTable был бы рай ))
у нас на фирме очень строго с подключением чего бы то ни было нового ((
но все равно спасибо!
PM MAIL   Вверх
amg
Дата 28.8.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Совсем несложно и  /proc  пропарсить. Надо только внимательно читать man proc. Вот:
Код

$now = time();

open BOOTSTAT, '<', '/proc/stat' or die "Cant't read /proc/stat: $!\n";
while (<BOOTSTAT>) {
  $boot_time = $1 if /^btime\s+(\d+)/;
}
close BOOTSTAT;

opendir PROCDIR, '/proc' or die "Cant't opendir /proc: $!\n";
while ($pid = readdir PROCDIR) {
  if (-d "/proc/$pid" and $pid =~ /^\d+$/) {
    
    open PROCSTAT, '<', "/proc/$pid/stat" or warn "Cant't read /proc/$pid/stat: $!\n" && next;
    ($command,$jiffies_from_boot) = (split ' ', <PROCSTAT>)[1,21];
    close PROCSTAT;
    $command =~ s/^\((.+)\)/$1/;
    $age = $now - $boot_time - $jiffies_from_boot/100;
    
    open PROCSTATUS, '<', "/proc/$pid/status" or warn "Cant't read /proc/$pid/status: $!\n" && next;
    while (<PROCSTATUS>) {
      $user = getpwuid($1) if /^Uid:\s+(\d+)/;
    }
    close PROCSTATUS;
    
#    open PROCENV, '<', "/proc/$pid/environ" or warn "Cant't read /proc/$pid/environ: $!\n";
#    %procENV = map {split '=', $_, 2} split "\0", <PROCENV>;
#    close PROCENV;
    
    printf "%-6s %-8s %8d %s\n", $pid, $user, $age, $command;
    #if ($user eq 'user' and $age > 24*3600) {
    #  kill 9, $pid or warn "Can't kill $pid: $!\n";
    #}
  }
}
close PROCDIR;
PS У меня дистрибутив другой, не федора, может быть не все подойдет, но принцип ясен.

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


Новичок



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

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



да спасибо большое все починил!!!
проблема была где взять данные

Добавлено через 5 минут и 11 секунд
starttime - proc/pid/stat элемент номер [21] )
boottime - proc/stat    -   btime
ну и время сейчас time

еще!
нужно обязательно поделить starttiime на hz если не вдаваться в подробности то на 100

формула для вычисления времени работы процесса получаеться

time_work_proc = time - boottime+(starttime/100)
PM MAIL   Вверх
amg
Дата 28.8.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(debugg @  28.8.2007,  12:54 Найти цитируемый пост)
time_work_proc = time - boottime+(starttime/100)

debugg, формула то неправильная. Там "-" вместо "+" должен быть.

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


Новичок



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

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



Цитата(amg @ 28.8.2007,  15:13)
Цитата(debugg @  28.8.2007,  12:54 Найти цитируемый пост)
time_work_proc = time - boottime+(starttime/100)

debugg, формула то неправильная. Там "-" вместо "+" должен быть.

Цитата

debugg, формула то неправильная. Там "-" вместо "+" должен быть.


нет там все правильно
starttime - это время прошедшее от старта системы ДО запуска процесса
PM MAIL   Вверх
amg
Дата 28.8.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Именно так. man proc:
Код

                     starttime %lu
                            The time in jiffies the process started after sys-
                            tem boot.
Тогда, может, ты скобку открывающую не туда поставил? Чтобы проверить, попробуй подставить свою формулу в мой код (см. выше), который распечатывает список процессов. Последним процессом там будет perl, который, собственно, и исполняет этот скрипт. Согласись, у него время д.б. маленькое.


Это сообщение отредактировал(а) amg - 28.8.2007, 15:48
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.0641 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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