2012-02-16 15 views

risposta

3

per questo scopo entrerò

sudo gvim &

ps aux | grep gvim

mi offre i seguenti dispositivi di output

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

per afferrare solo Il PID Io preferisco usare awk

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

che sarebbero tornati semplicemente

potrei uccidere il programma da awk e convogliando un'uccisione comando di bash

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

+0

Questo darà più risposte se ci sono altri processi di gvim in esecuzione contemporaneamente. –

+0

sì, il suo commento alla sua domanda originale non è stato scritto quando ho risposto a questa domanda. Modificherò la mia risposta quando avrò più tempo. – matchew

7

È possibile utilizzare $! per ottenere il PID dell'ultimo processo in background (che sarà il sudo in questo caso), e ps --ppid per scoprire circa i suoi figli. Così, per esempio:

$ 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 

Se stai facendo questo in uno script, si potrebbe desiderare di utilizzare un sleep 1 tra il sudo e ps per assicurare che il bambino viene avviato.

Si noti che se si deve veramente usare il flag -b su sudo, questo non funzionerà, in quanto ciò farà sì che sudo faccia un fork extra e esca immediatamente, perdendo la connessione tra figlio e genitore (il comando tcpdump otterrà riparato a init), il che significa che non avrai un modo semplice per distinguere il bambino da altri comandi simili.

0

L'opzione -o su ps consente di scegliere quali campi visualizzare. Di questi campi, puoi mostrare cose come il tempo cumulativo della CPU (cputime), il tempo trascorso (etime) e l'ora di inizio (lstart). È inoltre possibile ordinare su un campo utilizzando --sort. Quindi, una soluzione per voi potrebbe essere:

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

Non c'è nemmeno bisogno di dire a ps per visualizzare il campo che si desidera ordinare. man ps per maggiori dettagli.

5

Ecco un modo per farlo:

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

Le altre risposte qui si affidano a grep di ps. Se sono in esecuzione più comandi tcpdump, è possibile che accidentalmente venga inserito il pid errato. Questo ottiene il pid effettivo e lo inserisce in un file.

Ecco un esempio in esecuzione tcpdump come 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" 
$