LINUX.ORG.RU
ФорумAdmin

Получение информации о процессах с суммированием

 


0

1

Есть инструмент для получения информации о процессах вроде ps, top, htop, но чтобы он умел процессы суммировать? То есть, если у меня десять процессов /usr/bin/httpd то он должен отобразить одну строку, а не десять, в которой столбцы CPU%, RES, VIRT будут просуммированы.

★★★★★

Готовых утилит для такого не видел. Можно сделать как-нибудь так:

#!/usr/bin/perl
#

use strict;
use warnings;

use Data::Dumper;

# Example
# ps waux | grep [m]ain | perl sum.pl
#USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
#www-data 31316  0.0  1.7  54356 34960 ?        Ss   апр30  10:14 /var/www/foo/main.pl
#www-data 31317  0.0  2.0  59220 42848 ?        S    апр30   2:09 /var/www/foo/main.pl

my %data = (
        'cpu' => 0,
        'mem' => 0,
        'vsz' => 0,
        'rss' => 0
);

foreach my $line (<STDIN>) {
        my @raw = split(/\s+/, $line);
        $data{'user'} = $raw[0];
        $data{'pid'}  = $raw[1];
        $data{'cpu'}  = $data{'cpu'} + $raw[2];
        $data{'mem'}  = $data{'mem'} + $raw[3];
        $data{'vsz'}  = $data{'vsz'} + $raw[4];
        $data{'rss'}  = $data{'rss'} + $raw[5];
        $data{'tty'}  = $raw[6];
        $data{'stat'} = $raw[7];
        $data{'start'} = $raw[8];
        $data{'time'} = $raw[9];
        $data{'command'} = join(' ', @raw[10..$#raw]);
}

print Dumper(\%data);
shell-script ★★★★★
()

Готовых утилит для такого не видел.

Странно...
Проще самому тогда. По сути нужно взять столбцы COMMAND, %CPU, %MEM, затем отсортировать это всё по столбцу COMMAND и просуммировать. Но bash не умеет работать с массивами строк, может импортировать вывод в SQL, а затем действовать средствами SQL?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Так я же привёл простейший пример в своём сообщении. Правда, я для конкретной команды привёл, но расширить для всего вывода тоже вполне реально. Только тогда уж лучше, по-хорошему, брать данные не из вывода ps, а напрямую из /proc/.

SQL тут, имхо, перебор.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Я не знаю perl, поэтому твой скрипт под себя доработать не смогу, я правильно понимаю, что у тебя он суммирует main.pl, а нужно со скриптом работать так, если ты не знаешь заранее какие у тебя процессы есть?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Скрипт суммирует результаты команды ps waux | grep [m]ain

Подставь в grep свой процесс и будут результаты по нему.

Правда для вывода результата я использовал модуль Dumper. Если с установкой этого модуля проблемы, можно переписать без него. Это просто, но с телефона неудобно, могу вечером допилить. Там одну строку переписать.

shell-script ★★★★★
()
Ответ на: комментарий от gedisdone

Без фильтрации не сработает. Процессов может быть больше двух, они могут быть не в верху списка.

Вообще скрипт был только примером подхода, а не готовым решением. :)

Вечерком допилю.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

В принципе можно сделать:

#!/usr/bin/awk -f
{
  com = substr($0, index($0, $10));
  arr[com, "cpu"] += $2;
  arr[com, "mem"] += $3;
  arr[com, "vsz"] += $4;
  arr[com, "rss"] += $5;
  coms[com] = 1;
}

END { 
  for (com in coms) {
    print com, arr[com, "cpu"], arr[com, "mem"], arr[com, "vsz"], arr[com, "rss"] 
  }
}
С другой стороны может быть запущено несколько команд с разными аргументами, тогда можно просто брать по десятой колонке. Тогда значение com будет com = $10.

Запуск станет ps waux | awk -f sum.awk.

gedisdone ★★★
()
Последнее исправление: gedisdone (всего исправлений: 2)
Ответ на: комментарий от gedisdone

Да, в этом как раз идея.

По аргументам интересное замечание. Я их вообще никак не учитывал, но как раз возможно это имеет значение.

shell-script ★★★★★
()

pwsh

Get-Process | Group-Object ProcessName | Foreach {

    $name = $_.Name
    $cpu, $ws = ($_.Group | Measure-Object -Property CPU, WS -sum).sum
    $count = $_.Count
    
    [PSCustomObject] @{
   
       'Name' = $name
       'Count' = $count
       'CPU(s)' = [math]::round($cpu,2)
       'WS' = [math]::round(($ws / 1mb),2)
    }
}

Output:

Name                                Count CPU(s)     WS
----                                ----- ------     --
(sd-pam)                                1      0   2,39
accounts-daemon                         1   0,06   6,89
acpi_thermal_pm                         1      0      0
acpid                                   1   0,17   0,77
agent                                   1      0   5,34
at-spi-bus-launcher                     1   0,01   6,17
at-spi2-registryd                       1   0,58   6,83
ata_sff                                 1      0      0
avahi-daemon: chroot helper             1      0   0,33
avahi-daemon: running [mymsi.local]     1    0,3   3,21
baloo_file                              1   0,27  36,48
bash                                    1   0,01    3,9
blkcg_punt_bio                          1      0      0
bluetoothd                              1   0,01   4,28
boltd                                   1   0,03   6,36
cfg80211                                1      0      0
charger_manager                         1      0      0
cpuhp/0                                 1      0      0
cpuhp/1                                 1      0      0
cpuhp/2                                 1      0      0
cpuhp/3                                 1      0      0
cron                                    1      0   3,33
cryptd                                  1      0      0
cups-browsed                            1    0,3  10,46
cupsd                                   1   0,07   7,86
dbus-daemon                             3   2,53   14,2
dbus-launch                             1      0   2,39
dconf-service                           1      0   5,04
devfreq_wq                              1      0      0
dhclient                                2   0,01   12,3
DiscoverNotifier                        1   0,62   47,6
distro-release-notifier                 1   0,34  36,47
ecryptfs-kthrea                         1      0      0
edac-poller                             1      0      0
ext4-rsv-conver                         3      0      0
file.so                                 2   0,02  36,68
firefox                                 1  29,01 323,32
...
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.