Способ однозначного разбора /proc//stat (учитывая произвольное содержимое поля name)

Это bashскрипт, который требует bashиспользования в качестве интерпретатора.

Когда вы запускаете его с sh, вы не используете bash. Да, некоторые shна самом деле bashзамаскированы, но это не имеет значения (они не будут вести себя как "обычные" bashни при каких обстоятельствах ). Рассматривайте shи bashкак взаимоисключающие интерпретаторы, как если бы они были perlи python(, т.е. не пытайтесь их смешивать ).

Запустите скрипт с

$ bash teste.sh

или сделайте его исполняемым и запустите напрямую:

$ chmod +x teste.sh
$./teste.sh

Последний способ может быть предпочтительнее. Это позволяет сценарию через строку#!-решить, какой интерпретатор следует использовать.

4
20.12.2019, 14:59
3 ответа

Формат /proc/<pid>/statописан на справочной странице proc(5).

не может быть другим полем (...)и не может быть добавлено в будущем, потому что это сделало бы формат двусмысленным. В этом легко убедиться.

Код ядра, который форматирует файл /proc/<pid>/stat, находится в fs/proc/array.c .

ОП не сообщает, какой язык они используют. В Perl можно было бы использовать нечто подобное:

my @s = readfile("/proc/$pid/stat") =~ /(?<=\().*(?=\))|[^\s()]+/gs;

Обратите внимание, чтоs:поле «команда» может также содержать символы новой строки.

4
27.01.2020, 20:53

Поскольку все оставшиеся поля являются обычными числами, почему бы не работать в обратном порядке.

напр.

$ cat /proc/2086/stat
2086 (hello) (world) S 1893 2086 1893 34816 2175 1077952512 119 0 0 0 0 0 0 0 20 0 1 0 5098 7458816 179 18446744073709551615 94130946203648 94130946231776 140722152072096 0 0 0 0 0 0 1 0 0 17 0 0 0 0 0 0 94130948332368 94130948333696 94130971459584 140722152080859 140722152080880 140722152080880 140722152083432 0
$ awk '{ print $(NF-48) } ' /proc/2086/stat
1893
$

1
27.01.2020, 20:53

Вот как я разбираю файл статистики:

            static char c;
            static long pos = 0;
            fh = fopen(proc_stat_path, "r");
            if(fh == NULL)...


            // Find the last ")" char in stat file and parse fields thereafter.
            #define RIGHTBRACKET ')'
            while(1)
            {
                    c = fgetc(fh);
                    if (c == EOF) break;
                    if (c == RIGHTBRACKET) pos = ftell(fh);
            }
            fseek(fh, pos, 0);

            fscanf(fh, " %c %d %d"..., &state, &ppid,...);
0
21.04.2020, 13:45

Теги

Похожие вопросы