如何使用sudo运行命令的pid

use*_*005 11 unix linux bash shell sudo

我想要得到这个命令的pid.

sudo -b tcpdump -i eth0 port 80 -w eth0.pcap
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 10

您可以使用$!获取最后一个后台进程的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
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

这是一种方法:

sudo -u username sh -c "echo \$\$ > /tmp/my_pid/file; exec my_command" &
Run Code Online (Sandbox Code Playgroud)

这里的其他答案依赖于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"
$
Run Code Online (Sandbox Code Playgroud)