Почему вывод ps показывает процесс, даже если он не запущен?

Почему ps показывает процесс, даже если он не запущен. Пока работает Firefox:

$ echo $(ps aux | awk  '/firefox/{print $2}')
5964 6041

Но когда Firefox не работает, я попытался запустить ту же команду. Каждый раз показывался другой PID.

Я попытался разоблачить это:

$ ps aux | grep firefox
greenpa+  6056  0.0  0.0  15956   948 pts/11   S+   09:29   0:00 grep --color=auto firefox

Что это значит?

2 ответа

Решение

И вот почему вы не должны grep или иначе проанализировать вывод ps для сопоставления команд, но используйте такие инструменты, как pgrep а также pidof,

Когда ты бежишь ps | grep foo, grep foo процесс также указан ps - следовательно grep foo совпадает с любым другим foo процессы. То же самое происходит, когда вы делаете echo $(ps aux | awk '/firefox/...) - awk Команда соответствует сама.

Действительно, в зависимости от того, какой вывод вы хотите от ps, вы могли бы быть лучше, используя pgrep выход с ps, Например, состояния всех процессов Google Chrome в моей системе:

ps -p $(pgrep -d, chrome) -o pid,state

pgrep Гибкость в этом отношении очень полезна - обратите внимание, как я могу указать выходной разделитель с -d затем используйте его в качестве аргумента списка PID для ps, pgrep а также pkill также способны читать из файла PID.

Как уже указывал Муру, grep оставляет след в ps, однако есть небольшой обходной путь для использования grep с ps: используйте двойные кавычки и скобки на первой букве, например ps aux | grep "[f]irefox" (Источник: https://unix.stackexchange.com/a/74186/85039).

Другие вопросы по тегам