Как в Linux определить количество процессов, в названии которых где-либо присутствует точная строка «test test 123»?

Как в Linux определить количество процессов, в названии которых где-либо присутствует точная строка «test test 123»?

Я уже разобрался с этим в Windows, но как это сделать в Linux, мне неясно:

tasklist /V /NH | find "test test 123"

А затем я подсчитываю количество непустых строк в выводе. Это очень медленно, но работает. Теперь я ищу метод Linux, чтобы сделать то же самое.

То есть "тест тест 123" может быть полным названием процесса, может начинаться с него, может заканчиваться им или просто иметь его в середине. Это важно.

решение1

TL;DR: использоватьpgrep -cf "test test 123"


Программа psвыведет список всех запущенных процессов. В частности, попробуйте:

ps aux 

Теперь вы можете просто отфильтровать этот список, используя grepдля поиска нужной вам строки:

ps aux | grep "test test 123"

Это выведет совпадающие строки. Чтобы посчитать их, используйте, grep -cкоторая выведет количество совпадающих строк:

ps aux | grep -c "test test 123"

Проблема с этим подходом в том, что grepпроцесс выше также появится в результатах. Например, я в данный момент редактирую файл с именем test test 123, но если я запущу команду выше, я увижу как процесс моего редактора файлов, так и grepсам файл:

$ ps aux | grep  "test test 123"
terdon   2461453 22.0  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2462354  0.0  0.0   8832  2292 pts/1    S+   15:53   0:00 grep --color test test 123

Поэтому вместо grep -cвернётся :21

$ ps aux | grep -c "test test 123"
2

Что приводит нас к правильному инструменту для работы pgrep. Это инструмент, специально разработанный для поиска процессов:

$ pgrep -cf "test test 123"
1

Означает -c«подсчет совпадений» и -fозначает «поиск по всей командной строке, а не только по имени процесса».

Другой распространенный прием, позволяющий пропустить grepсаму строку, — использовать класс символов из одного символа вместо той же строки, чтобы grepкомандная строка не содержала эту строку:

$ ps aux | grep  "test test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2476971  0.0  0.0   8832  2236 pts/1    S+   15:56   0:00 grep --color test test 123
$ ps aux | grep  "[t]est test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
$ ps aux | grep -c "[t]est test 123"
1

Подробнее об этом трюке см.здесь. Но это на самом деле не обязательно, если ваша система имеет pgrepтакие же характеристики, как и Linux.

решение2

echo $(( $(ps aux | grep "test test 123" | wc -l) - 1))

должен к трюку

Связанный контент