Не знаю, как ваши ожидаемые результаты соотносятся с вашими входными данными. Я бы предложил:
$ perl -MPOSIX -MDate::Parse -pe 's{[^,]*}{
strftime("%Y%m%d%H%M%S", localtime str2time($&))}e'
Чтобы использовать способность GNU date
анализировать эти даты и избежать выполнения одного date
вызова в строке, вы можете (использовать оболочку с поддержкой процесса в стиле ksh --замены (как ksh, bash или zsh)):
paste -d, <(
Обратите внимание, однако, что это дает:
20181129151500,alert_logevent
20181129151500,alert_webhook
20181129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories
Хотя это то, о чем вы спрашивали, маловероятно, что это то, что вам нужно, поскольку эти Nov 29 15:15
кажутся скорее отметками времени из 2017 (прошлого года ), чем из будущего.
Похоже, что эти даты соответствуют ls -l
в локали POSIX. Таким образом, вы можете адаптировать эту функцию из другого Q&A , чтобы преобразовать ее в более полезный формат. Или лучше использовать лучший способ, чем ls -l
, для хранения дат файлов в файле в первую очередь (, например GNU find -printf
, или GNU date -r
, или zsh stat
, или GNU/BSD stat
, или ast ls --format
... ), где вы можете использовать более полезный, точный и недвусмысленный формат.
Вас интересует сумма пикового использования памяти каждым процессом или пиковая сумма использования памяти процессами?
Например, чтобы получить данные о пиковом использовании резидентной памяти для пяти крупнейших трат в вашей системе, вы можете сделать что-то вроде этого:
$ printf "PID\tPeak RSS usage (kB)\n"; grep VmHWM: /proc/*/status | sort -rnk2 | head -n 5 | perl -npe 's#^/proc/(\d+)/\S+\s+(\d+) kB$#$1\t$2#'
PID Peak RSS usage (kB)
19799 8515140
28243 930620
1357 911612
19833 766020
17926 734952
Это список 5 процессов, которые больше всего использовали оперативную память в своей истории процессов. Однако довольно часто эти процессы достигают пика не в один и тот же момент, поэтому пик суммы этих процессов, вероятно, намного ниже суммы пиков всех процессов.
Единственный надежный способ вычислить пиковую сумму использования памяти процесса для нескольких процессов — запустить этот набор процессов в отдельной памяти cgroup
. Теоретически вы просто запускаете программу с systemd-run --pipe --user --pty...
и затем отслеживаете пиковое использование этой памяти cgroup
. Однако, по моему опыту, systemd-run
неправильно реализует временные группы пользовательского режима, поэтому вам придется создать отдельный системный уровень cgroup
, содержащий группу, которую вы хотите измерить, а затем запустить дерево процессов в этой группе.Если вы запустите достаточно свежий дистрибутив с более новым systemd-run
, чем я пробовал, он может работать без каких-либо взломов. Подробности см. в https://stackoverflow.com/a/61916151/334451. Вы можете проверить результаты через крепление памяти cgroup
, которое обычно монтируется где-то ниже /sys/fs/cgroup
. Возможные местоположения включают подкаталоги memory
или unified
. Попробуйте mount | grep cgroup
для получения подробной информации. Ваш результат может быть memory.max_usage_in_bytes
, но я думаю, что это зафиксированное использование, а не фактическое использование резидентной ОЗУ -, вы не указали, какой из них вы ищете. См. memory.stat
в памяти cgroup
для дополнительной статистики.
Если вы используете контрольную группу временной памяти, вы, вероятно, захотите запустить, например,. long sleep
в качестве последнего процесса, чтобы убедиться, что у вас достаточно времени, чтобы прочитать пиковое использование памяти, прежде чем контрольная группа будет удалена после завершения вашего дерева процессов.