Sto cercando di ottenere il pid di questo comando.Come ottenere il pid di comando in esecuzione con sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
Sto cercando di ottenere il pid di questo comando.Come ottenere il pid di comando in esecuzione con sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
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
Questo darà più risposte se ci sono altri processi di gvim in esecuzione contemporaneamente. –
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
È 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.
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.
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"
$
non "ps -ef" farlo? –
Sto eseguendo diversi comandi tcpdump come, quindi voglio fare qualcosa come $! (Ultimo comando pid). – user87005
'ps aux | grep sudo | tail -n 1' non funzionerebbe? – khachik