¿Cómo puedo solicitar ps
mostrar solo procesos de usuario y no hilos de kernel?
Vea esta pregunta para ver a qué me refiero ...
¿Cómo puedo solicitar ps
mostrar solo procesos de usuario y no hilos de kernel?
Vea esta pregunta para ver a qué me refiero ...
Esto debería hacer (bajo Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) tiene PPID 0 ( en Linux 2.6+ ) pero ps
no permite filtrar por PPID 0; Por lo tanto, esta solución.
kthreadd
siempre sea PID 2?kthreadd
, luego cree laps
llamada correspondiente. ¿Qué tan seguro está de que esta cosa "siempre" se llame "kthreadd"? Una solución segura sería más complicada, se ejecutaps
normalmente y analiza la salida, tal vez haga algunas pruebas.x
bandera que no funciona con esto.ps au --ppid 2 -p 2 --deselect
funciona bienUna forma de reconocer los procesos del kernel es que no usan memoria de usuario, por lo que el campo vsz es 0. Esto también atrapa a los zombies (gracias a Stephane Chazelas por esta observación), que pueden eliminarse en función de su estado.
Para enumerar solo los PID:
fuente
En la práctica, encontré el siguiente idioma suficiente:
Filtra las líneas que terminan entre paréntesis, lo que puede resultar en la omisión de entradas no deseadas, pero es muy poco probable. A cambio, es bastante fácil de recordar y relativamente rápido de escribir.
Algunos procesos como avahi-daemon agregan a su información de nombre de proceso entre paréntesis (el nombre de host en el caso de avahi-daemon) y serán filtrados por este comando.
fuente
Una de las particularidades de esos procesos es que no están respaldados por un archivo ejecutable, por lo que podría hacer ( en zsh ):
O con cualquier shell POSIX:
Eso es verificar los procesos cuyo
/proc/<pid>/exe
es un enlace a un archivo.Pero eso significa que debe ser superusuario para poder verificar el estado del
/proc/<pid>/exe
enlace simbólico.Editar : como sucede, los procesos zombies (al menos) satisfacen la misma condición, por lo que si no desea que se excluyan, tendrá que volver a agregarlos. Me gusta:
Tenga en cuenta que
ps -f
muestra esos nombres de proceso entre corchetes no porque sean procesos del núcleo, sino porque tienen un vacíoargv[]
(por lo que ps muestra el nombre del proceso en lugar deargv[0]
allí). Puede tener un proceso de espacio de usuario con un espacio vacíoargv[]
también y puede tener un nombre de proceso con unargv[0]
formulario que sea[some-string]
así que filtrar laps
salida en función de esos corchetes no es una opción infalible.fuente
zsh
sintaxis. El segundo es estándar POSIXsh
(yps
yfind
ycut
ypaste
) sintaxis. Por supuesto,/proc
POSIX no lo especifica.wc -l
). Bueno, entonces aceptaré la respuesta de Hauke Laging y te daré un voto positivo. ;)También podría analizar el
ps
resultado y buscar nombres de procesos que no estén entre paréntesis:fuente
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- pero aún obtendrá procesos que mencionan dicho nombre de usuario, y dejará el archivo temporal por ahí. Retiraré mi voto negativo, pero solo porque su tercera solución es razonable.$NF
es la última palabra de la línea de comando en laps aux
salida. Los procesos no kernel pueden tener[...]
allí. Como dije en mi respuesta, la[xxx]
notación no se debe a que son procesos del núcleo, sino porque no tienen línea de comando (sin argumento), lo que también está permitido para los procesos que no son del núcleo.Para cualquiera que intente esto en busybox donde
ps
está muy simplificado y el resultado es diferente, esta variante de la gran respuesta de Gilles funciona bien:Según la respuesta de Gilles, la metodología aquí es encontrar procesos que no usan memoria de usuario (`vsz col == 0) y filtrar procesos zombies (el estado col no es 'Z').
Las columnas de salida se pueden ajustar fácilmente, siempre que los números de campo awk basados en 1 se ajusten en consecuencia. Vea las opciones que tiene su ps disponible al poner un valor falso y se lo dirá. Por ejemplo:
fuente
Si solo necesita los recuentos ... Tenía una necesidad similar de filtrar los procesos kernel vs. usuario, pero solo necesitaba los respectivos recuentos de cada uno. Esta fue mi solución:
Salida de muestra :
Explicación : Estoy usando el truco de que se puede suponer que los procesos VSZ = 0 son procesos del núcleo. Entonces
awk
, con , evalúo una comparación en VSZ (desdeps -eo vsize
), si es igual a cero. El resultado de la comparación será un booleano 0 o 1. Hago una matrizp[]
y, a medida que avanzo en la lista de procesos, si es un proceso de kernel, incrementep[1]++
. De lo contrario, como proceso de usuario, incrementep[0]++
. Después de todo el incremento, etiqueto e imprimo los valores (es decir, los recuentos) para p [0] y p [1] en elEND { }
bloque.fuente
Lo que estás buscando, mi amigo, no es
ps
, peropstree
.Primero, identifique el primer proceso del núcleo. Su PID es comúnmente 1 en el sistema sin systemd y 2 con systemd.
Luego usa este comando:
La respuesta seleccionada (una con ✅) está usando otro comando:
El problema con este
ps
comando es que solo incluye hijos directos pero no todos los descendientes. Elpstree
comando incluye a todos los descendientes. Puede comparar y contar la salida de estos dos comandos (una manera fácil es usar| wc
) para verificar.fuente
He creado el script psa para ese propósito. Tenga en cuenta que depende de la herramienta linechop .
fuente