Як увімкнути використання програми в пам'яті та процесорі?


16

Подібно до питання Як зареєструвати завантаження процесора? , Я хотів би записати пам'ять процесу.

Процес, який я хочу зареєструвати, вбивається на віддаленому сервері, і я хочу з’ясувати завантаження процесора та використання пам'яті безпосередньо перед його вбивством.

[оновлення]

Обидва акуратного маленького сценарію пітона і Стефано Палацо

Вихідні значення одного рядка Michał менші, ніж у topпроцесора та Mem. У вас є ідея, чому?

вихідний верх:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

вихід сценарію python Стефано Палаццо:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Я, на жаль, поки не можу коментувати, але ви можете знайти цю публікацію, яка цікавить, чому вона psможе відрізнятися від top: stackoverflow.com/questions/131303/…
PM

Відповіді:


16

Ви можете створити однокласинну оболонку:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

для входу в процес з допомогою pid = 123 просто:

logpid 123

або переглянути та записати журнал у файл:

logpid $$ | tee /tmp/pid.log

Якщо ви хочете реєструвати інші дані, змініть -o {this}параметри. Дивіться man psрозділ "СТАНДАРТНІ СПЕЦІФІЄРИ" щодо доступних параметрів. Якщо ви хочете різної часової роздільної здатності, змініть sleep {this}функцію logpid().


Просто і робить роботу!
rafaelbattesti

3

Якщо ви точно за topстатистикою, ви можете запустити topв пакетному режимі, вказуючи pid того процесу, який ви хочете. Беручи приклад із цієї сторінки ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ), якщо ви ввели

top -b -d 10 -n 3 >> top-file

У вас буде "верхній запуск у пакетному режимі (-b). Він буде оновлюватися кожні 10 секунд, як зазначено прапором затримки (-d), для загальної кількості 3 ітерацій (-n). Вихід буде надісланий у файл. " У тому числі -pви можете вказати pidпроцес, який ви хочете. Це, звичайно, поверне більше, ніж просто процесор і оперативні пристрої, але вони будуть містити поля. У моєму випадку, наприклад, я можу отримати таке під час моніторингу Pid 9189 за допомогою top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

Ця сторінка, хоч і не виконує перенаправлення до файлу, виконує деякі більш складні модифікації, що дозволяють отримати лише роздрукований процесор. Якщо ви хтось знає про хороший спосіб перенаправити вихід у файл і його періодично оновлювати, мені було б цікаво знати. watchмені не здається ідеальним для цього: superuser.com/questions/281347/filtering-top-command-output
PM

2

Цей простий скрипт python повинен робити все, що вам потрібно:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Спочатку потрібно з’ясувати ідентифікатор процесу програми, яку ви хочете контролювати, після чого ви можете запустити скрипт із PID як аргумент:

python log.py 3912

Він надрукує використання процесора та використання оперативної пам'яті у відсотках двічі на секунду:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Потім ви можете перенаправити його вихід на файл, щоб пізніше імпортувати його в електронну таблицю ( python log.py 9391 > firefox_log.txt) та імпортувати дані в електронну таблицю, вибравши Tabсвій роздільник.

Програма закривається при натисканні на Ctrl + C або при знищенні процесу.


Шановний Стефано, дуже дякую за твій сценарій. На жаль, це, здається, дає неправильні результати. У вас є ідеї, чому? Перегляньте моє оновлене запитання.
Framester

На сторінці ps man man7.org/linux/man-pages/man1/ps.1.html , ps виводить "використаний час процесора, поділений на час запущеного процесу (співвідношення cputime / realtime), виражене у відсотках "- отже, ви отримуєте середнє використання процесора з моменту його запуску
Ніколас Чарльз,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.