Почему вывод 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).