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