2010-06-17 3 views
15

Я искал лучший способ найти количество запущенных процессов с тем же именем через командную строку в Linux. Например, если бы я хотел найти количество запущенных процессов bash и получить «5». В настоящее время у меня есть сценарий, который выполняет «pidof», а затем делает подсчет для токенированной строки. Это работает отлично, но мне было интересно, есть ли лучший способ, который можно сделать полностью через командную строку. Заранее спасибо за вашу помощь.Поиск количества процессов в Linux через командную строку

ответ

46

В системах pgrep доступных, вариант -c возвращает счетчик количества процессов, которые соответствуют данному имени

pgrep -c command_name 

Обратите внимание, что это grep -стиля матча, а не точного , так, например, pgrep sh также будет соответствовать процессам bash. Если вы хотите точное совпадение, используйте также опцию -x.

Если pgrep недоступно, вы можете использовать ps и wc.

ps -C command_name --no-headers | wc -l 

-C вариант ps принимает command_name в качестве аргумента, и программа печатает таблицу с информацией о процессах, исполняемым имя которого совпадает с заданным именем команды. Это точное совпадение, а не grep-стиль. Опция --no-headers подавляет заголовки таблицы, которые обычно печатаются как первая строка. С --no-headers вы получаете одну линию для каждого процесса. Затем wc -l подсчитывает и печатает количество строк на входе.

+1

Убирать заголовки хорошо по какой-то причине, когда я запускаю ps, есть 2 процесса, и когда я запускаю ' ps --no-заголовки | wc -l' есть 3 процесса. Кажется, он считает начальную новую строку? – CMCDragonkai

+1

Хмм, похоже, что 'pgrep -c' не является опцией OpenBSD/Darwin. Не могли бы вы добавить небольшое объяснение, почему вы выбрали эти флаги (для обеих команд)? Без какого-либо объяснения это затрудняет пользователям другого дистрибутива даже использовать страницу «человек», чтобы попытаться перевести ваши намерения ... – cwd

+0

@cwd Конечно, я отредактировал. –

9
result=`ps -Al | grep command-name | wc -l` 
echo $result 
+0

Это именно то, что Я искал :) –

0

Следующий сценарий bash может быть запущен как задание cron, и вы можете получить электронную почту, если какой-либо процесс слишком сильно перескакивает.

for i in `ps -A -o comm= --sort=+comm | uniq`; 
do 
    if ((`ps -C $i --no-headers | wc -l` > 10)); then 
     echo `hostname` $i `ps -C $i --no-headers | wc -l` ; 
    fi 
done 

Замените 10 на ваш вопрос.

TODO: «10» также может передаваться как параметр командной строки. Кроме того, в список исключений можно включить несколько системных процессов.

2

Некоторые из вышеперечисленных не работали для меня, но они помогли мне на этом пути.

ps aux | grep [j]ava -c 

Для новичков в Linux:

ps aux печатает все запущенных процессов, grep поиск всех процессов, которые соответствуют слову Java, в [] скобки удалить процесс, который вы только что бежал так это обыкновение включать что в качестве ходового процесса и, наконец, опция -c означает количество.

3

Вы можете попробовать:

пс -ef | Grep -cw [р] rocess_name

ИЛИ

пс Окс | Grep -cw [р] rocess_name

например:

пс -ef | Grep -CW [я] нит

+0

Мне нравится, как просто и чисто это решение –

-1

Я не знаю, что это на других дистрибутивах, но на Ubuntu, это:

nproc 

nproc является частью coreutils. Таким образом, он должен быть доступен на большинстве дистрибутивов Linux.

1

Список всех имен процесса, сортировки и подсчета

ps --no-headers -A -o comm | sort | uniq -c 

Вы также можете перечислить процесс, прикрепленную к TTY

ps --no-headers a -o comm | sort | uniq -c 

Вы можете фильтровать с:

ps --no-headers -A -o comm | awk '{ list[$1] ++ } END { for (i in list) { if (list[i] > 10) printf ("%20s: %s\n", i, list[i]) } }' 
Смежные вопросы