Я использую
ps -ef | grep java | wc -l
чтобы узнать количество запущенных java-процессов в любой момент времени.
Вышеупомянутая команда, очевидно, учитывает команду "ps -ef | grep java" также в результате.
Чтобы избежать этого, я обнаружил, что могу использовать
ps -ef | grep [j]ava | wc -l
и он отлично работает. Однако я хотел бы выяснить причину, по которой он может пропустить исходную команду из результатов.
Потому что, когда вы используете grep для [j] ava, процесс называется grep [j] ava ». '[j] ava' не соответствует регулярному выражению '[j] ava' и поэтому не отображается в результатах.
Когда вы это сделаете:
ps -ef | grep [j]ava | wc -l
вы используете шаблон [j]ava
который соответствует любому одиночному символу в квадратных скобках (который состоит только из единственной буквы j
), за которым сразу следуют символы ava
. Сам процесс grep не содержит буквы j
сразу за которыми следуют буквы ava
, но вместо этого содержит квадратную скобку, тогда j
, затем закрывающая квадратная скобка, затем ava
.
То есть шаблон не совпадает сам с собой.
Это не совсем ответ на ваш вопрос, но ...
Другой распространенный способ добиться того же:
ps -ef|grep java|grep -v grep|wc -l
Это, конечно, работает, выполняя перевернутый grep для самого термина grep
Вы изменили имя процесса grep, так что он больше не содержит термин "java"
Чтобы согласиться с другими ответами, которые, надеюсь, помогут прояснить:
grep java соответствует всему, что содержит java.
grep Ява
Ява
grep [j] ava явно соответствует "java":
grep [j] ava <- Здесь нет строки "java", поэтому она не соответствует
Ява
использовать команду pgrep?
начиная с JDK 1.5, у вас есть jps (linux / usr / lib / jvm / java-6-sun / bin / jps). Вы можете использовать его во всех операционных системах (Linux, Windows, Solaris)