Corro ps -ejH | less
. La salida incluye ps
y less
también.
¿Cuál es la razón? Pensé que funcionaría de la siguiente manera:
- Primero,
ps
se ejecutará y enumerará todos los procesos existentes en ese momento. - Luego, la salida de
ps
se introducirá enless
.
Pero según esta lógica, ninguno de los ps
dos less
debería aparecer en la salida de ps
.
Entonces, ¿por qué se incluyen estos procesos en el resultado de ps
? ¿Funciona ps
un poco diferente a lo que he descrito?
Respuesta1
Elcaparazóncomienza ambos, para establecer los extremos de la tubería, de modo que ps
se ve a sí mismo y al proceso en el otro extremo de la tubería.
Respuesta2
"Pero según esta lógica, ni ps ni menos deberían aparecer en la salida de ps".
Sí, entonces tu lógica es errónea, porque ambos aparecen. Cuando ejecuta un comando en un shell Un*x, muy pocos (si es que hay alguno) se ejecutan en el shell. Se bifurca un proceso separado para ejecutar ese comando.
Cuando canaliza dos comandos juntos, ambos comandos se inician en procesos separados y la salida estándar del primero se vincula a la entrada estándar del segundo.
Entonces, muy poco después de ejecutar ps|less, tiene tres procesos: uno ejecutando su shell, otro ejecutando ps y otro ejecutando less. Como la salida es generada por ps, menos se trabajará en ella en paralelo (dividida según sea necesario). Ambos comandos se ejecutan en paralelo, no secuencialmente, con un almacenamiento en búfer mínimo.
A medida que ps recorre la lista de procesos, busca y muestra tanto a sí mismo como a less, y también el shell principal, y el padre del padre, y así sucesivamente hasta init. Y todo lo demás en el sistema. Es por eso que su salida incluye ps y less.
Respuesta3
Usar
ps -ef | grep [l]ess
para evitar menos.
[l]ess
coincideless
como expresión regular pero no como cadena fija.