Katakanlah saya memiliki skrip bash yang dipanggil log.sh
. Dalam skrip ini, saya ingin membaca input dari sebuah pipa, tetapi saya juga ingin tahu perintah yang digunakan untuk memasukkan pipa ke saya. Contoh:
tail -f /var/log/httpd/error | log.sh
Dalam skrip shell, saya ingin tahu perintahnya tail -f /var/log/httpd/error
.
Jawaban:
Akira menyarankan untuk menggunakan
lsof
.Begini caranya Anda bisa membuat skrip:
whatpipe2.sh
Menjalankannya:
Cara lain adalah menggunakan grup proses.
whatpipe1.sh
Menjalankannya:
Perhatikan bahwa keduanya hanya berfungsi jika perintah di sisi kiri pipa berjalan cukup lama untuk
ps
melihatnya. Anda bilang Anda menggunakannyatail -f
, jadi saya ragu ini masalah.sumber
pipa akan muncul sebagai entri dalam daftar arsip terbuka dari proses Anda:
Anda juga dapat menggunakan sesuatu seperti:
jadi, daripada Anda memiliki inode dari pipa :) Anda sekarang dapat mencari setiap proses lainnya di bawah
/proc/
untuk pipa itu. maka Anda akan memiliki perintah yang mengirimkan kepada Anda:dalam contoh ini,
cat
disalurkan ke bangsalsh
. di/proc/29889
Anda dapat menemukan file bernamacmdline
yang memberitahu Anda, apa yang disebut:bidang-bidang pada baris perintah dipisahkan oleh NUL, sehingga terlihat agak jelek :)
sumber
Inilah solusi ringkas menggunakan
lsof
distribusi modern di Linux modern:Ini mencantumkan file titik akhir (
+E
) FD 0 pada proses shell saat ini (-p $$ -a -d 0
), kemudian membatasi output hanya untuk PID (-t
), menghasilkan PID di kedua sisi pipa.Perhatikan bahwa:
{ echo Hi; sleep 5 ; } | whatpipe.sh
Kemungkinan akan menghasilkan abash
(subkulit input) dansleep 5
.+E
hanya tersedia jikalsof
dikompilasi dengan-DHASUXSOCKEPT
. Itu seharusnya benar untuk sebagian besar distro Linux modern, tetapi tetap periksa instalasi Anda dengan:lsof -v 2>&1 | grep HASUXSOCKEPT
sumber