Próbuję pobrać pid tego polecenia.Jak uzyskać pid polecenia działającego z sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
Próbuję pobrać pid tego polecenia.Jak uzyskać pid polecenia działającego z sudo
sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
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
Daje to więcej odpowiedzi, jeśli istnieją inne procesy gvim działające w tym samym czasie. –
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
$!
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ń.
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.
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"
$
nie będzie "ps -ef" zrobić? –
Używam kilku poleceń tcpdump, więc chcę zrobić coś podobnego do $! (Ostatnie polecenie pid). – user87005
'ps aux | grep sudo | ogon -n 1' nie działa? – khachik