¿Cómo hacer que solo el usuario, el pid y el comando se ejecuten para un proceso específico? (Ubuntu 11.10)

19

Cuando lo hago ps -ef|grep pythonme sale lo siguiente:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

¿Cómo obtengo solo el usuario que ejecuta el proceso, el pid y el comando se ejecutan para el proceso como en el siguiente resultado?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
fuente
¿Esto funciona? ps --fields="user pid command"
pratnala
No lo intenté. Lo encontré en la red. No cerca de una máquina Ubuntu ahora. Lo siento. Lo veré más tarde y te lo
haré
No, me sale ERROR: Desconocido gnu opción larga. ¿Funciona para ti?
Bentley4

Respuestas:

13

Supongo que estás buscando el argumento -o:

-o formato:

formato definido por el usuario. formato es un argumento único en forma de una lista separada por comas o en blanco, que ofrece una forma de especificar columnas de salida individuales. Las palabras clave reconocidas se describen en la sección ESPECIFICADORES DE FORMATO ESTÁNDAR a continuación. Los encabezados pueden renombrarse (ps -o pid, ruser = RealUser -o comm = Command) según se desee. Si todos los encabezados de columna están vacíos (ps -o pid = -o comm =), la línea del encabezado no se mostrará. El ancho de columna aumentará según sea necesario para encabezados anchos; esto se puede usar para ampliar columnas como WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). También se ofrece control de ancho explícito (ps opid, wchan: 42, cmd). El comportamiento de ps -o pid = X, comm = Y varía con la personalidad; la salida puede ser una columna llamada "X, comm = Y" o dos columnas llamadas "X" e "Y". Use múltiples opciones -o cuando tenga dudas. Use la variable de entorno PS_FORMAT para especificar un valor predeterminado como desee; DefSysV y DefBSD son macros que se pueden usar para elegir las columnas UNIX o BSD predeterminadas.

Entonces el comando que deseas sería (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

bajo OpenSolaris el comando es:

ps -o ruser,pid,comm -ef|grep python
Simón
fuente
3
¿Eso realmente funciona para ti? Cuando ejecuto ese comando me saleWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4
Sí, me funciona en ksh bajo OpenSolaris. El resultado es el que desea ... Consulte las páginas de manual para ver si hay ps en su sistema man ps. Tal vez la sintaxis es ligeramente diferente en su sistema.
Simon
1
Pero el OP está en bash y no en ksh
pratnala
1
@ Bentley4 Si solo desea el comando y no necesita información adicional, puede soltar el argumento -f y usar el siguiente comando:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

El más simple probablemente sería:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

De esa manera, obtienes todo directamente psy no necesitas analizar nada.

Desde la pspágina del manual:

-o formato

Formato definido por el usuario. formato es un argumento único en forma de una lista separada por comas o en blanco, que ofrece una forma de especificar columnas de salida individuales. [...] Los encabezados pueden renombrarse (ps -o pid, ruser = RealUser -o comm = Command) según se desee. Si todos los encabezados de columna están vacíos (ps -o pid = -o comm =), la línea del encabezado no se mostrará.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

La -Copción funcionará si está ejecutando pythoninteractivamente, no si python está ejecutando un script. En ese caso deberías usar -C scriptname.pyen su lugar.

terdon
fuente
1

Mi versión de PS es diferente, por lo que puede requerir algunos ajustes, pero puede usar cortar (y posiblemente tr dependiendo de lo que esté tratando de lograr), por ejemplo, algo como

ps ef | corte -c1-16,50-   

Proporcionará los caracteres 1-16 y 50 en adelante de cada línea de su declaración ps. (Sus números reales probablemente necesitarán un poco de masaje).

Otra forma de hacerlo (pero perderá el formato) podría ser

ps ef | tr -s "" | corte -f1,2,8- -d ""

Lo cual comprimirá el espacio en blanco en el comando ps, luego tomará los campos 1,2 y 8 en adelante y los mostrará.

davidgo
fuente
Solo para un proceso obtengo media página de información en pantalla completa con esos comandos. Es bastante ilegible, estoy 'masajeando' los parámetros, pero hasta ahora no he podido obtener nada de lo que quiero de forma remota.
Bentley4
1
ps -eo user,pid,cmd | grep [p]ython

Ejemplo:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Explicación:

  • -e todos los procesos
  • -o formato definido por el usuario
  • user,pid,cmd Mostrar usuario, ID de proceso, columnas de comando

Nota: si usa -fcon lo -eque otros han sugerido, puede obtener errores. Esto se debe a que ambos parámetros controlan el formato de salida y solo uno de ellos debe usarse:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
bmaupin
fuente