¿Cómo puedo grep la salida PS con los encabezados en su lugar?
Estos dos procesos forman una aplicación que se ejecuta en mi servidor ...
root 17123 16727 0 16:25 pts/6 00:00:00 grep GMC
root 32017 1 83 May03 ? 6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
¿ 6-22:01:17
significa que ha estado funcionando durante 6 días? Estoy tratando de determinar la duración de cuánto tiempo se ha estado ejecutando el proceso ...
¿Es la segunda columna la identificación del proceso? Entonces, si lo hago kill 32017
, ¿matará el segundo proceso?
ps -e
selecciona todos los procesos yps -f
es una lista de formato completo que muestra los encabezados de las columnas. Luego canalizamos los encabezados de columna y la salida a egrep, que es grep extendido y permite que la tubería|
tenga un significado especial, que es OR (esto O aquello). Por lo tanto, termina haciendo coincidir el PID en los encabezados de columna más las líneas de salida que importan.ps -ef | grep -E 'GMC|PID'
Gracias a geekosaur, me gustaría usar este comando para sus demandas, en lugar de un comando separado:
Lo complicado es hacer uso de ";" compatible con el shell para encadenar el comando.
fuente
ps -ef
repetido. aún mejor esps -ef | { head -1 ; grep "your-pattern" ; }
ps -ef | { head -1; grep "pattern" | head -5; }
. ¡Útil si el patrón grep-ed tiene muchos resultados!La segunda columna es la identificación del proceso; El cuarto es cuando se creó el proceso (generalmente es el momento en que comenzó su programa, pero no siempre; considere
execve()
y amigos); Sexto es la cantidad de tiempo de CPU consumido. Así que ha estado funcionando durante 8 días y usó casi 7 días de tiempo de CPU, lo que consideraría preocupante.Obtener el encabezado en la misma invocación es complicado en el mejor de los casos; Solo haría una por separado
ps | head -1
. Puede considerar usarps
los propios métodos de selección o algo así enpgrep
lugar degrep
, que en realidad no está diseñado para pasar encabezados.fuente
83
?nice
valor asignado por el usuario o el sistema . Los números más pequeños son de mayor prioridad. En este caso,grep
es la prioridad 0 porque se bloqueó en las lecturas de disco y cedió para escribir su salida, yPNetTNetServer.bin
es un gran número porque usa constantemente su segmento de tiempo sin bloquear. (La programación es compleja y los detalles dependerán del planificador exacto que se use)La solución egrep es simple y útil, pero, por supuesto, depende de que el encabezado siempre contenga 'PID' (sin embargo, una suposición más que razonable) y la misma cadena no ocurre en ningún otro lugar. Supongo que esto es suficiente para sus necesidades, pero en caso de que alguien quiera una alternativa, hay sed.
Sed le permite simplemente decir "imprima la primera línea, luego cualquier línea que contenga el patrón". Por ejemplo:
Agregar
/sed -n/d;
al filtro se sedimentó:fuente
/sed -n/d
no es correcto. Es posible que tenga algún comando existentesed -n
que desea imprimir. El truco es usarsed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'
. ;-) Nota[]
alrededor de cualquier carácter en la cadena de búsqueda.alternativa más fácil:
ps -ef | { head -1; grep GMC; }
reemplace el número con el número de líneas en las que se muestra su encabezado.
fuente
ps -ef | { head -1; grep GMC; }
. También me gusta en una función como la siguiente:function pgrep() { ps -ef | { head -1; grep $@; } }
podrías obtener el pid con pgrep
y luego usa ps con el pid
o incluso combinar los dos en un comando
Esto mostraría solo la línea que desea e incluiría el encabezado.
fuente
Escribí un pequeño programa Perl que imprimirá
A menudo lo uso como
ps | 1andre GMC
, pero también puede tomar argumentos de archivo (cada archivo proporciona su propia línea de encabezado para las coincidencias realizadas en las líneas de ese archivo).fuente