> strace w 2>&1 | grep urandom
read(4, "/usr/bin/grep\0urandom\0", 2047) = 22
>
¿Por qué "w" necesita urandom? ¿Cómo evitar esto?
ACTUALIZAR:
> strace w 2>&1 | awk '/urandom/'
read(4, "awk\0/urandom/\0", 2047) = 14
>
Entonces, ¿es el filtrado lo que tiene que ver con el urandom?
> strace who 2>&1 | grep urandom
>
Entonces, ¿por qué no se ve afectado "quién"?
w
que necesitaurandom
. Es porquePiped commands run concurrently
: unix.stackexchange.com/questions/37508/…urandom
acceso en elw
código fuente.grep
y tuawk
. No estáw
abriendo el/dev/urandom
archivo del dispositivo. Es similar aps -aux | grep grep
strace w 2>&1 | grep unicorns
;-)Respuestas:
Como se explica en otras respuestas y comentarios, la razón de lo que observa es la forma en que
Bash
maneja las tuberías. Para filtrar lo que realmente quiere en situaciones similares, puede intentar encerrar la primera letra delgrep
argumento de[]
esta manera:EDITAR:
Como señaló correctamente R. en el comentario a continuación, de hecho
strace
, no ve el otro lado de la tubería. De manera similar a lops aux | grep grep
que también se muestragrep grep
en su salidaw
es caminar a través del/proc
directorio y encuentra elgrep
proceso allí.fuente
strace
no (y no puede, de ninguna manera fácil) rastrear los otros comandos en la tubería de shell. Más bien,w
está buscando los comandos actuales que se ejecutan en su terminal (y otros terminales), y se ejecuta en el grep como parte de su trabajo.Desde la página del manual
w(1)
:Para mostrar los procesos de los usuarios, pasa por todos los procesos que se ejecutan en la máquina. Intentemos esto:
Dentro de la traza encontramos líneas como estas (en un sistema Linux):
Lo que muestra
w
explícitamente pasar/proc
y mirar las líneas de comando de todos los procesos (y otras cosas, no se muestran). Encuentra elgrep
que corre paralelo a él y eso es lo que lostrace
ve hacer. La tubería no tiene nada que ver con eso, aparte de iniciar ambos procesos al mismo tiempo. En cierto modo, es similar aps | grep
ver el grep en sí.who
y la mayoría de los otros comandos no necesitan la información sobre los procesos, y no van a buscar, por lo que no ve lo mismo al rastrearlos.fuente