Estoy tratando de obtener el pid de este comando.Cómo obtener el pid de comando ejecutando con sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
Estoy tratando de obtener el pid de este comando.Cómo obtener el pid de comando ejecutando con sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
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
Esto le dará más respuestas si hay otros procesos gvim ejecutándose al mismo tiempo. –
sí, su comentario a su pregunta original no fue escrito cuando respondí esta pregunta. Enmendaré mi respuesta cuando tenga tiempo adicional. – matchew
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.
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.
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"
$
no va a "ps-ef" hacerlo? –
Estoy ejecutando varios comandos tcpdump como, por lo que quiero hacer algo como $! (Último comando pid). – user87005
'ps aux | grep sudo | tail -n 1' no funcionaría? – khachik