2010-06-17 8 views
15

Estaba buscando la mejor forma de encontrar la cantidad de procesos en ejecución con el mismo nombre a través de la línea de comandos en Linux. Por ejemplo, si quería encontrar el número de procesos bash en ejecución y obtener "5". Actualmente tengo un script que hace un 'pidof' y luego cuenta la cadena tokenizada. Esto funciona bien, pero me preguntaba si había una forma mejor de hacerlo completamente a través de la línea de comando. Gracias de antemano por tu ayuda.Encontrar recuento de procesos en Linux a través de la línea de comandos

Respuesta

46

En sistemas que tienen pgrep disponibles, la opción -c devuelve un recuento del número de procesos que coinciden con el nombre dado

pgrep -c command_name 

Tenga en cuenta que este es un partido al estilo grep, no una exacta partido, así que por ejemplo pgrep sh también coincidirá con los procesos bash. Si desea una coincidencia exacta, también use la opción -x.

Si pgrep no está disponible, puede usar ps y wc.

ps -C command_name --no-headers | wc -l 

La opción -C-ps toma command_name como un argumento, y el programa muestra una tabla de información acerca de los procesos cuyo nombre coincide con el nombre ejecutable orden dada. Esta es una coincidencia exacta, no grep -style. La opción --no-headers suprime los encabezados de la tabla, que normalmente se imprimen como la primera línea. Con --no-headers, obtiene una línea por proceso emparejado. Luego, wc -l cuenta e imprime el número de líneas en su entrada.

+1

Limpiar los encabezados es bueno por alguna razón, cuando ejecuto ps hay 2 procesos y cuando ejecuto ' ps --no-encabezados | wc -l' hay 3 procesos. Parece contar la nueva línea inicial? – CMCDragonkai

+1

Hmm, parece que 'pgrep -c' no es una opción en OpenBSD/Darwin. ¿Podría agregar una pequeña explicación de por qué ha seleccionado esos indicadores (para ambos comandos)? Sin alguna explicación, hace que sea difícil para los usuarios en una distribución diferente incluso usar una página de 'hombre' para tratar de traducir sus intenciones ... – cwd

+0

@cwd seguro, he editado. –

9
result=`ps -Al | grep command-name | wc -l` 
echo $result 
+0

Esto es exactamente lo Estaba buscando :) –

5
ps -Al | grep -c bash 
0

El siguiente script bash se puede ejecutar como un trabajo cron y posiblemente pueda recibir un correo electrónico si algún proceso se bifurca demasiado.

for i in `ps -A -o comm= --sort=+comm | uniq`; 
do 
    if ((`ps -C $i --no-headers | wc -l` > 10)); then 
     echo `hostname` $i `ps -C $i --no-headers | wc -l` ; 
    fi 
done 

Reemplace 10 con su número de preocupación.

TODO: "10" también se puede pasar como parámetro de línea de comandos. Además, pocos procesos del sistema pueden incluirse en la lista de excepciones.

2

Algunas de las anteriores no me funcionaron, pero me ayudaron en mi camino hacia esto.

ps aux | grep [j]ava -c 

para los novatos en Linux:

ps aux imprime todos los procesos actualmente en ejecución, grep busca todos los procesos que coinciden con la palabra java, los [] soportes de eliminar el proceso que se acaba de ejecutar por lo que suele incluir que como un proceso en ejecución y finalmente la opción -c significa recuento.

3

que puede probar:

ps-ef | grep -cw [p] rocess_name

O

ps aux | grep -cw [p] rocess_name

por ejemplo:

ps-ef | grep -cw [i] nit

+0

Me gusta lo simple y limpia que es esta solución –

-1

No sé lo que es en otras distribuciones, pero en Ubuntu, es:

nproc 

nproc es parte de coreutils. Por lo tanto, debería estar disponible en la mayoría de las distribuciones de Linux.

1

Lista de todos los nombres de proceso, clasificar y contar

ps --no-headers -A -o comm | sort | uniq -c 

También puede enumerar proceso unido a un TTY

ps --no-headers a -o comm | sort | uniq -c 

Usted puede filtrar con:

ps --no-headers -A -o comm | awk '{ list[$1] ++ } END { for (i in list) { if (list[i] > 10) printf ("%20s: %s\n", i, list[i]) } }' 
Cuestiones relacionadas