2012-02-16 10 views

Respuesta

3

para este fin voy a entrar

sudo gvim &

ps aux | grep gvim

me suministra con el siguiente resultado

root 11803 0.0 0.0 12064 2776 pts/3 T 12:17 0:00 sudo gvim

para agarrar solamente El PID Yo prefiero usar awk

ps aux | awk '/gvim/ {print $2}'

la que volvería simplemente

podría matar el programa de awk así mediante la canalización de una matanza comando para bash

ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash

+0

Esto le dará más respuestas si hay otros procesos gvim ejecutándose al mismo tiempo. –

+0

sí, su comentario a su pregunta original no fue escrito cuando respondí esta pregunta. Enmendaré mi respuesta cuando tenga tiempo adicional. – matchew

7

Puede utilizar $! para obtener el PID del último proceso de fondo (que será el sudo en este caso), y ps --ppid para averiguar acerca de sus hijos. Así, por ejemplo:

$ sudo tcpdump -i eth0 port 80 -w eth0.pcap & 
$ ps --ppid $! -o pid= 
16772 
$ ps --pid 16772 
    PID TTY   TIME CMD 
16772 pts/3 00:00:00 tcpdump 

Si usted está haciendo esto en un script, es posible que desee utilizar un sleep 1 entre el sudo y ps para garantizar que el niño se inicia.

Tenga en cuenta que si realmente debe usar la bandera -b para sudo, esto no funcionará, ya que esto hará que sudo haga una bifurcación adicional e inmediatamente salga, perdiendo la conexión entre el hijo y el padre (el comando tcpdump obtendrá reparented to init), lo que significa que no tendrás una manera fácil de distinguir al niño de cualquier otro comando similar.

0

La opción -o de ps le permite elegir qué campos mostrar. De esos campos, puede mostrar cosas como el tiempo acumulado de la CPU (cputime), el tiempo transcurrido (etime) y la hora de inicio (lstart). También puede ordenar en un campo usando --sort. Por lo que una solución para usted podría ser:

ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1 

Ni siquiera necesita decir ps para visualizar el campo que desea ordenar. man ps para más detalles.

5

Aquí hay una manera de hacerlo:

sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" & 

Las otras respuestas aquí se basan en grepping salida de ps. Si hay múltiples comandos tcpdump en ejecución, puede accidentalmente grep el pid incorrecto. Esto obtiene el pid real y lo pone en un archivo.

He aquí un ejemplo que ejecuta tcpdump como root:

$ sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap" & 
[1] 37201 
tcpdump: listening on en3, link-type EN10MB (Ethernet), capture size 65535 bytes 
$ sudo kill `cat /tmp/tcpdump.pid` 
6212 packets captured 
6243 packets received by filter 
0 packets dropped by kernel 
[1]+ Done     sudo -u root sh -c "echo \$\$ > /tmp/tcpdump.pid; exec tcpdump -i en3 -w eth0.pcap" 
$ 
Cuestiones relacionadas