如何获取使用sudo运行的命令的进程ID(PID)

15

我想要获取这个命令的进程ID。

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

我正在运行多个tcpdump命令,因此我想做类似于$!(上一个命令的pid)的操作。 - user87005
ps aux | grep sudo | tail -n 1 不起作用吗? - khachik
4个回答

16

您可以使用$!获取最后一个后台进程的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
如果您正在使用脚本执行此操作,建议在sudops之间使用sleep 1,以确保子进程得到启动。
请注意,如果您确实必须使用-b标志来执行sudo,则此方法将不起作用。因为这会导致sudo进行额外的fork并立即退出,失去了子进程和父进程之间的连接(tcpdump命令将被重新分配给init),这意味着您没有简单的方法来区分该子进程与任何其他类似的命令。

8
这里有一种方法:

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

这里的其他答案依赖于grep ps输出。如果有多个tcpdump命令正在运行,您可能会错误地grep 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"
$

这将做正确的事情(r)。 - Tripp Kinetics
以防万一有人像我一样追踪“错误”的pid问题:; my_command将给出sudo的PID,但是; exec my_command将给出您要查找的进程的PID。 sudo -u username sh -c“ echo \$\$> /tmp/my_pid/file; exec my_command”&<除非您还想花费10分钟来使用$PID + 1,否则不要忘记exec - joshfindit

4
为此,我将输入以下命令: sudo gvim & 然后使用以下命令来获取PID: ps aux | awk '/gvim/ {print $2}' 这将返回PID 11803。如果需要,也可以使用以下命令在awk中使用kill命令终止程序: ps aux | awk '/gvim/ {print "sudo kill -9 "$2}' | bash

1
如果同时运行其他gvim进程,这将为您提供更多答案。 - Chris Dodd
1
是的,在我回答这个问题的时候,他对他原来的问题的评论还没有写下。我会在有更多时间的时候修改我的回答。 - matchew
1
强烈推荐使用pgrep这种策略,可以节省很多精力。 - Eliezer Miron

0

ps 命令的 -o 选项允许您选择要显示的字段。这些字段中,您可以显示诸如累积 CPU 时间(cputime)、已过时间(etime)和启动时间(lstart)等内容。您还可以使用 --sort 对字段进行排序。因此,对您来说,一个解决方案可能是:

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

你甚至不需要告诉 ps 显示你想排序的字段。有关更多详细信息,请参阅 man ps


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接