2012-02-16 14 views

Odpowiedz

3

do tego celu wejdę

sudo gvim &

ps aux | grep gvim

dostarcza mi następujący wynik

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

tylko chwycić PID wolę używać awk

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

który wróci po prostu

mógłbym zabić program z awk także przez rurociągi zabić polecenie do bash

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

+0

Daje to więcej odpowiedzi, jeśli istnieją inne procesy gvim działające w tym samym czasie. –

+0

tak, jego komentarz do pierwotnego pytania nie został napisany, gdy odpowiedziałem na to pytanie. Zmienię swoją odpowiedź, gdy będę miał dodatkowy czas. – matchew

7

$! można użyć, aby uzyskać PID ostatniego procesu w tle (który będzie sudo w tym przypadku), a ps --ppid aby dowiedzieć się o swoich dzieci. Tak więc na przykład:

$ 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 

Jeśli robisz to w skrypcie, to może chcieć użyć sleep 1 między sudo i ps aby upewnić się, że dziecko rozkręci.

Pamiętaj, że jeśli naprawdę musisz użyć flagi -b do sudo, to nie zadziała, ponieważ spowoduje to, że sudo zrobi dodatkowy fork i natychmiast wyjdzie, tracąc połączenie między dzieckiem a rodzicem (komenda tcpdump otrzyma reparented to init), co oznacza, że ​​nie będziesz miał łatwego sposobu na odróżnienie dziecka od innych podobnych poleceń.

0

Opcja do ps pozwala wybrać pola do wyświetlenia. Na tych polach można wyświetlać takie dane, jak łączny czas procesora (cputime), czas, który upłynął (etime), i czas rozpoczęcia (lstart). Możesz również sortować na polu przy użyciu --sort. Więc rozwiązaniem dla Ciebie może być:

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

Nie trzeba nawet powiedzieć ps aby wyświetlić pole, które chcesz sortować. man ps, aby uzyskać więcej informacji.

5

Oto jeden ze sposobów, aby to zrobić:

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

innych odpowiedzi tutaj polegać na grepping wyjście ps. Jeśli uruchomionych jest wiele poleceń tcpdump, możesz przypadkowo pominąć niewłaściwy pid. To pobiera rzeczywisty pid i umieszcza go w pliku.

Oto przykład działa tcpdump jako 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" 
$ 
Powiązane problemy