Jika, dalam bash
, saya mengeksekusi:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
di mana cmd{1..n}
mungkin tidak berbeda, bagaimana cara mendapatkan PID cmdi
? Atau, bagaimana saya bisa menandai cmdi
proses? (Misalnya, kirimkan SIGUSR1
?)
pkill
/ pgrep
, pidof
Dll. Tidak terlihat seperti jawaban yang baik, karena contoh lain cmdi
mungkin berjalan, termasuk sebagai bagian dari pipa yang sama. jobs -p
memberikan PID cmd1
untuk saya.
i
bisa apa saja {1..n}
.
bash
shell
pipe
job-control
muru
sumber
sumber
cat /var/run/out | nc -l 8080
hanya terlihat serupa dengancmd1 | cmd2
? Kendala Anda, bahwa Anda ingin mengetikkan pipa telanjang dan kemudian memulihkan PID, adalah (1) tidak disebutkan dalam pertanyaan, dan (2) tidak memungkinkan untuk solusi umum yang baik.cmd1 | cmd2
adalah kasus yang sangat khusus di mana kedua PID mudah diperoleh. Apakah saya mengatakan sesuatu tentang n? Jadi mengapa Anda mengasumsikan n = 2? Apakah saya mengatakan sesuatu tentang cmdi? Jadi mengapa Anda menganggap saya bisa memodifikasi cmdi? Saya meminta solusi umum dan Anda memberlakukan batasan.Jawaban:
Untuk versi asli dari pertanyaan, ketika hanya PID perintah terakhir yang diinginkan, variabel khusus
$!
sempurna.Tidak ada akses mudah serupa ke PID dari proses lain.
Butuh waktu lama untuk
$pipestatus
(zsh) dan$PIPESTATUS
(bash) untuk ditambahkan, akhirnya memberi kita akses ke semua status keluar dalam pipa, selain$?
untuk yang terakhir yang sudah ada sejak shell Bourne asli. Mungkin sesuatu yang analog akan terjadi pada$!
akhirnya.sumber
Saya pikir Anda bisa melakukan sesuatu seperti yang disarankan di sini .
Di sini, dalam contoh di atas, saya telah mengambil pid dari proses pipa ketiga dan mencatatnya ke file pid. Saya bisa mencatatnya untuk setiap proses pipa.
sumber
jobs -p
. memberi sinyal denganSIGPIPE
. Apakah kamu maucmdi
- ini.Solusi khusus Linux yang tidak terlalu portabel adalah melacak proses menggunakan pipa yang menghubungkannya. Kita bisa mendapatkan PID dari perintah pertama (
jobs -p
) dan terakhir ($!
) di dalam pipa. Menggunakan salah satu PID, skrip ini dapat melakukan pekerjaan:sumber
Saya menggunakan array berbasis nol di sini dalam kode ini. Berhati-hatilah dengan apa yang Anda jalankan
eval
.sumber