如何使用sudo运行命令的pid

时间:2012-02-16 17:16:15

标签: linux bash shell unix sudo

我正在尝试获取此命令的pid。

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

4 个答案:

答案 0 :(得分:9)

您可以使用$!获取上一个后台进程的pid(在这种情况下将是sudo),并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

如果您是在脚本中执行此操作,则可能需要在sleep 1sudo之间使用ps以确保该子项启动。

请注意,如果你真的必须使用-b标志来sudo,这将无效,因为这将导致sudo执行额外的fork并立即退出,丢失了child和parent之间的连接(tcpdump命令将被重新定义为init),这意味着你没有简单的方法来区分孩子和任何其他类似的命令。

答案 1 :(得分:5)

这是一种方法:

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

这里的其他答案依赖于grepping ps输出。如果有多个tcpdump命令在运行,您可能会意外地弄错了错误的pid。这将获得实际的pid并将其放入文件中。

以下是以root身份运行tcpdump的示例:

 $ 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"
$

答案 2 :(得分:3)

为此我将进入

sudo gvim &

ps aux | grep gvim

为我提供以下输出

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

只抓住我喜欢使用awk的pID

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

只会返回

  
    

11803

  

我可以通过将kill命令传递给bash

来从awk中删除该程序

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

答案 3 :(得分:0)

-o的{​​{1}}选项可让您选择要显示的字段。在这些字段中,您可以显示累积cpu时间(ps),已用时间(cputime)和开始时间(etime)等内容。您还可以使用lstart对字段进行排序。所以你的解决方案可能是:

--sort

您甚至不需要告诉ps -eo pid,command,lstart --sort lstart | grep 'sudo -b tcpdump' | tail -1 显示您要排序的字段。 ps了解更多详情。