Оболочка Linux, которая отслеживает время загрузки процессора и памяти - PullRequest
0 голосов
/ 04 марта 2011

Краткий обзор того, что я пытаюсь сделать:

Эмулировать программу оболочки, которая выполняет команды, когда пользователь вводит их в свой собственный процесс, и после завершения каждого процесса выводит общее время, которое всеДочерние процессы и оболочка израсходовали на ЦП, а также максимальный объем памяти, использованный одним процессом.

Создание оболочки и выполнение команд не проблема, но когда дело доходит до отслеживаниястатистика о процессах - вот что меня застряло.

Для отслеживания времени процессора я собирался использовать системный вызов time и передавать команду пользователя через оболочку и во время, чтобы процесс могзакончить бег, и в конце исполнения у меня будет доступная мне информация о времени.Но когда дело доходит до получения времени, которое оболочка (текущая программа) потратила на процессор, я не совсем уверен, что делать, потому что каждая реализация времени, которое я видел или встречал, использует вышеупомянутый метод передачикоманды и аргументы во времени, и я не могу сделать это с оболочкой.Единственная идея, которая у меня есть на данный момент, состоит в том, чтобы сделать оболочку дочерним процессом, запустить его во времени, а когда оболочка завершит выполнение дочернего процесса, перезагрузить оболочку, извлечь информацию из времени и перезагрузить оболочку.Это кажется очень округлым, но я не могу найти какие-либо системные вызовы, чтобы делать то, что я хочу.

Что касается использования памяти, я думал об использовании top и затем извлекал информацию, но только iirc topотслеживает текущее использование памяти, а не общее.Единственное, о чем я мог подумать, - это зайти в / proc // и попытаться извлечь информацию откуда-то там.Что, опять же, кажется очень окольным.

Любой толчок в правильном направлении был бы потрясающим.Все это делается в C, если это имеет значение.

1 Ответ

0 голосов
/ 04 марта 2011

Один из возможных способов - запускать каждую пользовательскую команду как отдельный процесс, а когда процесс завершается, получить информацию об использовании ресурсов. Хорошо, запустить команду как процесс достаточно просто (см. Fork () и exec * family). Как насчет использования ресурсов (время, память и т. Д.)? Я предлагаю взглянуть на системный вызов getrusage ().

мужчина говорит:

Функция getrusage () должна дать оценку используемых ресурсов посредством текущий процесс или его остановка и ожидание ребенка процессы. Если значение Аргументом является RUSAGE_SELF, информация должна быть вернулся около ресурсы, используемые текущим процессом. Если значение кто такой аргумент RUSAGE_CHILDREN, информация должна быть возвращена об использованных ресурсах посредством прерваны и ожидают детей текущего процесса.

Посмотрим, какую информацию предоставляет этот системный вызов:

struct rusage {
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* messages sent */
    long   ru_msgrcv;        /* messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};

Я думаю, этого будет достаточно, чтобы решить вашу проблему.

...