Почему делает 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
Что это значит?
И поэтому вам не следует 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 ).