Nama proses di ujung lain dari pipa unix?

8

Jika dua proses dihubungkan oleh pipa,

> cmd1 | cmd2

adakah cara untuk cmd1mengetahui nama (atau PID) proses di sisi lain pipa ( cmd2)?

Begitu juga sebaliknya, adakah cara untuk cmd2mendapatkan nama / PID cmd1?

Saya tahu bahwa ada isatty(3)untuk memeriksa apakah output pergi ke (atau input berasal dari) terminal, jadi saya bertanya-tanya apakah ada cara untuk mengetahui sedikit lebih banyak tentang sisi lain.

shark.dp
sumber
1
Ini akan menjadi platform-spesifik di terbaik; dimana kamu mencoba melakukannya?
Michael Homer
Saya akan baik-baik saja dengan versi khusus Linux.
shark.dp
5
Secara teori mungkin ada lebih dari satu proses di ujung pipa yang lain, jika cmd2bercabang dua.
Nate Eldredge
6
Meskipun ini mungkin, saya benar-benar ragu itu ide yang bagus; pertanyaan ini berbau seperti masalah XY.
Nate Eldredge
@NateEldredge Memang:cmd1 | (cmd2 & cmd3)
Barmar

Jawaban:

14

Anda dapat melihat pipa di /proc/$PID/fd. Deskriptor adalah symlink ke sesuatu seperti pipe:[188528098]. Dengan informasi itu Anda dapat mencari proses lainnya:

$ lsof -n | grep -w 188528098
sleep      1565   hl    1w     FIFO    0,12     0t0  188528098 pipe
sleep      1566   hl    0r     FIFO    0,12     0t0  188528098 pipe

Atau, jika Anda ingin memastikan (untuk pemrosesan otomatis) bahwa nomor tersebut adalah soket dan bukan bagian dari nama file:

$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'

Dengan lsof4.88 dan di atasnya, Anda juga dapat menggunakan tanda -Eatau +E:

Dalam kombinasi dengan -p <pid>,, -d <descriptor>Anda bisa mendapatkan informasi endpoint untuk deskriptor spesifik pid yang diberikan .

$ sleep 1 | sh -c 'lsof -E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sh      27176 chazelas    0r  FIFO   0,10      0t0 2609460 pipe 27175,sleep,1w

Di atas memberi tahu kami bahwa fd0 of shadalah pipa dengan fd 1 of sleepdi ujung yang lain. Jika Anda mengubah -Eke +E, Anda juga mendapatkan informasi lengkap untuk itu dari sleep:

$ sleep 1 | sh -c 'lsof +E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   27066 chazelas    1w  FIFO   0,10      0t0 2586272 pipe 27067,sh,0r 27068,lsof,0r
sh      27067 chazelas    0r  FIFO   0,10      0t0 2586272 pipe 27066,sleep,1w

(lihat bagaimana lsofjuga memiliki pipa di stdin-nya)

Hauke ​​Laging
sumber
6
Seseorang harus siap untuk ini gagal; mis. jika proses di ujung yang lain telah mengubah UID dan Anda tidak memiliki izin untuk lsofitu.
Nate Eldredge