Cómo obtener (desde el terminal) el número total de subprocesos (por proceso y total para todos los procesos)

Respuestas:

53

Para obtener el número de hilos para un pid dado:

ps -o nlwp <pid>

Para obtener la suma de todos los hilos que se ejecutan en el sistema:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
fuente
1
ps -o nlwp <pid>devuelve NLWP :), ¿qué significa eso?
Siddharth
2
@Siddharth NLWP significa Número de procesos LightWeight, que es el número de subprocesos.
jcollado
Puede suprimir el "NLWP" con "h" (ocultar encabezados); es decir:ps h -o nlwp $pid
bufh
8

Para encontrar la cantidad de subprocesos que ejecutan un solo proceso, puede consultar /proc/<pid>/status. Debe enumerar el número de subprocesos como uno de los campos.

anaken78
fuente
3

Estoy basando esta respuesta alrededor ps axms . pses una gran herramienta para enumerar lo que se está ejecutando.

Si desea filtrar eso por un proceso, puede intentar algo como esto:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

Restamos 1 porque grep se mostrará en esa lista.

Para todos los hilos en general, esto debería funcionar:

echo $(( `ps axms | wc -l`  - 1))

Restamos uno esta vez porque hay una fila de encabezado.

Oli
fuente
Esto es inexacto, ya que informa un hilo adicional por proceso
Score_Under
1

Para obtener el número total de subprocesos (partes pequeñas de un proceso que se ejecutan simultáneamente) de un puede usar el comando ps -o nlwp <pid>Funciona todo el tiempo. Pero si prefieres intentar verlo a través de un archivo. probablemente debería mirar los archivos que se crearon para todos y cada uno de los procesos del sistema. Allí puede obtener los últimos detalles del proceso. Para cada proceso, hay una carpeta creada /proc/<pid>allí donde puede ver todos los demás detalles también.

Laksith
fuente
1

En Linux específicamente, aquí hay una forma de hacerlo por proceso:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

Luego puede invocar este script con un PID como argumento, e informará el número de hilos que posee ese proceso.

Para obtener el recuento de hilos para todo el sistema, esto es suficiente:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

Estos enfoques pueden parecer un poco poco ortodoxos, ya que dependen en gran medida de las funciones de shell, pero a cambio, ambos son más rápidos que los enfoques correspondientes psy awkbasados ​​en mi máquina (sin crear hilos propios para las tuberías). Tenga en cuenta que el shell lanzado para ejecutar estos scripts tendrá un hilo propio (o más, si está utilizando una implementación extraña).

Score_Under
fuente