2012-02-16 67 views
10

我想獲得此命令的pid。如何獲得與sudo運行命令的pid

sudo -b tcpdump -i eth0 port 80 -w eth0.pcap 
+0

不會 「PS -ef」 辦呢? – 2012-02-16 17:21:14

+0

我正在運行幾個tcpdump命令,所以我想做點像$!(最後一個命令pid)。 – user87005 2012-02-16 17:25:09

+0

'ps aux | grep sudo |尾巴-n 1'不會工作? – khachik 2012-02-16 17:34:20

回答

3

爲此,我將進入

sudo gvim &

ps aux | grep gvim

提供我下面的輸出

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

只搶將PID我寧願用awk

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

這將簡單地返回

我會殺從awk程序以及通過管道一殺命令bash

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

+0

如果有其他gvim進程同時運行,這會給你更多的答案。 – 2012-02-16 17:56:20

+0

是的,當我回答這個問題時,他對原始問題的評論沒有寫出來。當我有更多的時間時,我會修改我的答案。 – matchew 2012-02-16 18:15:54

7

您可以使用$!獲得最後的後臺進程的PID(這將是在這種情況下,須藤),並ps --ppid以瞭解它的孩子。因此,例如:

$ 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 

如果你在一個腳本這樣做,你可能想使用一個sudops之間sleep 1的,以確保兒童得到啓動。

請注意,如果您確實必須使用-b標誌進行sudo操作,則此操作將不起作用,因爲這會導致sudo執行額外的分支並立即退出,從而失去子父項之間的連接(tcpdump命令將獲得重新初始化爲初始化),這意味着您將沒有簡單的方法將孩子與其他任何類似的命令區分開來。

0

-o選項爲ps可讓您選擇要顯示的字段。在這些字段中,您可以顯示諸如累積cpu時間(cputime),已用時間(etime)和開始時間(lstart)之類的信息。您也可以使用--sort對字段進行排序。所以,你的解決方案可能是:

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

你甚至都不需要告訴ps顯示要作爲排序依據的領域。 man ps瞭解更多詳情。

5

下面是做這件事:

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

這裏其他的答案依靠grepping ps的輸出。如果有多個tcpdump命令在運行,您可能會意外地grep錯誤的pid。這會得到實際的pid並將其放入一個文件中。

下面是運行的tcpdump作爲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" 
$