Как в Linux определить количество процессов с точной строкой «test test 123» в любом месте названия процесса?

Вы можете включить ведение журнала специально для раздела %post вашего кикстарта. (Я предполагаю кикстарт, потому что вы указали «автоматическая установка» через anaconda; кикстарт - наиболее вероятный метод, о котором я знаю.)

 %post [--erroronfail] [--interpreter /usr/bin/python] [--log LOG] [--nochroot]

В официальной документации RHEL7 Installation Guide есть несколько примеров. Даже если вы не устанавливаете RHEL, система кикстарта/анаконды очень стабильна и едина для всех дистрибутивов, которые ее используют. Непосредственно из документа:

 # Start of the %post section with logging into /root/ks-post.log
 %post --log=/root/ks-post.log

 # Mount an NFS share
 mkdir /mnt/temp
 mount -o nolock 10.10.0.2:/usr/new-machines /mnt/temp
 openvt -s -w -- /mnt/temp/runme
 umount /mnt/temp

 # End of the %post section
 %end

В том же документе я предлагаю вам проверить раздел 26.3 Справочник по синтаксису Kickstart , в частности:

  • 26.3.5 Пост -сценарий установки
  • 26.3.6 Обработка ошибок быстрого старта

Официальная документация по «кикстарту» тоже приличная, но иногда скудная, и ее трудно найти.https://pykickstart.readthedocs.io/en/latest/

0
16.04.2020, 17:31
2 ответа
echo $(( $(ps aux | grep "test test 123" | wc -l) - 1))

должно быть хорошо

0
19.03.2021, 02:28

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.

1
19.03.2021, 02:28

Теги

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