2012-02-16 102 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" 
$