Это bash
скрипт, который требует bash
использования в качестве интерпретатора.
Когда вы запускаете его с sh
, вы не используете bash
. Да, некоторые sh
на самом деле bash
замаскированы, но это не имеет значения (они не будут вести себя как "обычные" bash
ни при каких обстоятельствах ). Рассматривайте sh
и bash
как взаимоисключающие интерпретаторы, как если бы они были perl
и python
(, т.е. не пытайтесь их смешивать ).
Запустите скрипт с
$ bash teste.sh
или сделайте его исполняемым и запустите напрямую:
$ chmod +x teste.sh
$./teste.sh
Последний способ может быть предпочтительнее. Это позволяет сценарию через строку#!
-решить, какой интерпретатор следует использовать.
Формат /proc/<pid>/stat
описан на справочной странице proc(5)
.
не может быть другим полем (...)
и не может быть добавлено в будущем, потому что это сделало бы формат двусмысленным. В этом легко убедиться.
Код ядра, который форматирует файл /proc/<pid>/stat
, находится в fs/proc/array.c .
ОП не сообщает, какой язык они используют. В Perl можно было бы использовать нечто подобное:
my @s = readfile("/proc/$pid/stat") =~ /(?<=\().*(?=\))|[^\s()]+/gs;
Обратите внимание, чтоs
:поле «команда» может также содержать символы новой строки.
Поскольку все оставшиеся поля являются обычными числами, почему бы не работать в обратном порядке.
напр.
$ 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
$
Вот как я разбираю файл статистики:
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,...);