Похоже на вопросКак регистрировать загрузку процессора?, Я хотел бы зарегистрировать память процесса.
Процесс, который я хочу зарегистрировать, завершен на удаленном сервере, и я хочу узнать загрузку ЦП и использование памяти непосредственно перед его завершением.
[обновлять]
И аккуратный маленький скрипт на Python Стефано Палаццо, и
Значения выходных данных Михала в одну строку меньше, чем в top
для ЦП и Памяти. Есть ли у вас идея, почему?
выход сверху:
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
решение1
Вы можете создать однострочный код в оболочке:
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()
.
решение2
Если вам нужна именно top
статистика, вы можете запустить ее top
в пакетном режиме, указав pid нужного вам процесса. Взяв пример с этой страницы (http://www.dedoimedo.com/computers/linux-cool-hacks.html) если вы набрали
top -b -d 10 -n 3 >> top-file
Вы бы "запустили top в пакетном режиме (-b). Он будет обновляться каждые 10 секунд, как указано флагом задержки (-d), для общего количества 3 итераций (-n). Вывод будет отправлен в файл". Включая, -p
вы можете указать pid
процесс, который вам нужен. Это, конечно, вернет больше, чем просто cpu и ram, но оно будет содержать эти поля. В моем случае, например, я бы получил следующее при мониторинге 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
решение3
Этот простой скрипт на 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 или при завершении процесса.
решение4
Прокпатможет использоваться для записи метрик Procfs приложения (деревьев процессов), включая использование ЦП и размер резидентного набора (RSS). Полное раскрытие информации: я написал это.
Возьмем в качестве примера Firefox. На моей машине его дерево процессов выглядит так:
/usr/lib/firefox/firefox
├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
└─ /usr/lib/firefox/firefox -contentproc -childID 8 ...
С помощью Procpath вы можете собирать метрики процесса из этого дерева следующим образом (и см.документацияесли вы хотите запросить у супервизора процесса вашего объединения, например systemd или Docker, корневой PID):
procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'
С помощью этой команды Procpath будет собирать и записывать метрики Procfs этого дерева раз в 10 секунд. Вы можете оставить его запущенным в терминальном мультиплексоре (например, Byobu), чтобы он работал в фоновом режиме на вашем сервере.
Если приложение снова даст сбой, вы можете использовать эту команду для визуализации загрузки ЦП и размера резидентного набора приложения.
procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer