¿Por qué la salida ps muestra un proceso incluso si no se está ejecutando?

¿Por qué la ps muestra un proceso incluso si no se está ejecutando? Mientras Firefox se está ejecutando:

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

Pero cuando Firefox no se está ejecutando, intenté ejecutar el mismo comando. Se mostró un PID diferente cada vez.

Intenté grepping

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

Qué significa eso?

Y esta es la razón por la que no debería grep o, de lo contrario, analizar la salida de ps para comandos coincidentes, sino usar herramientas como pgrep y pidof .

Cuando corres ps | grep foo ps | grep foo , el proceso grep foo también está listado por ps – por lo tanto, grep foo coincide con cualquier otro proceso foo . Lo mismo sucede exactamente cuando haces echo $(ps aux | awk '/firefox/...) : el comando awk coincide solo.

De hecho, dependiendo de la salida que desee de ps , puede que sea mejor utilizar la salida de pgrep con ps . Por ejemplo, los estados de todos los procesos de Google Chrome en mi sistema:

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

La flexibilidad de pgrep a este respecto es muy útil; observe cómo puedo especificar un delimitador de salida con -d , luego utilícelo como argumento de lista PID para ps . pgrep y pkill también son capaces de leer desde un archivo PID.

Sin embargo, como ya se ha señalado, grep deja un rastro de sí mismo en el ps, sin embargo, hay una pequeña solución para usar grep con ps: use comillas dobles y corchetes en la primera letra, así que ps aux | grep "[f]irefox" ps aux | grep "[f]irefox" (Fuente: https://unix.stackexchange.com/a/74186/85039 ).