获取发送管道进程的PID

获取发送管道进程的PID

为了

$ any-process | receiver

可以receiver获取发送进程的PID吗?

答案1

不直接。可以,但需要识别它所连接的管道,然后在所有其他 pid 中搜索连接到该管道的管道。

假设receiverpid 1730。它可以查看/proc/self/fd/0(或者更简单地,/proc/self/fd/0)并看到它显示为 的符号链接pipe:[43270]/proc/1730/fdinfo/0。然后它会发现/proc/1729/fd/1显示为符号链接pipe:[43270],并且/proc/1729/fdinfo/1看到它在标志中01。因此,它找到了一个控制管道另一端的过程。

请注意:

  • 这是 Linux 特有的方法,不可移植且效率低下
  • 多个进程可能能够写入该管道(而且,写入根本不需要位于 fd 1)
  • 它很容易出现竞争条件
  • 如果any-process由不同的用户拥有,receiver将无法查看他们的文件描述符

如果您想要让两个进程以经过身份验证的方式进行通信,则应该使用 unix 套接字。通过它们,可以通过SO_PASSCRED选项使用SCM_CREDENTIALS带有发送者的 pid、uid 和 gid 类型的辅助消息。发送者指定的凭据由内核检查,以确保它不会撒谎(除非它具有适当的功能,根进程/CAP_SYS_ADMIN能够指定与其自身不同的进程 ID)。

答案2

一个简单的方法可以通过将执行进程重定向到文件描述符 3 来实现,下面是一个示例睡觉通过管道传送到的命令附注命令 :

( sleep 100 & echo $!>&3 ) 3>pid | ps -p "$(<pid)"

您可以检查命令 sleep 的过程:

ps -p $(<pid)

相关内容