
Я уже разобрался с этим в 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
вернётся :2
1
$ 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))
должен к трюку