GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menunggu keluar dari proses non-anak

Di BSD dan OS X, Anda dapat menggunakan kqueue dengan EVFILT_PROC+NOTE_EXIT untuk melakukan hal itu. Tidak diperlukan pemungutan suara. Sayangnya tidak ada yang setara dengan Linux.


Anda juga dapat membuat soket atau FIFO dan membacanya. FIFO sangat sederhana:Hubungkan keluaran standar anak Anda dengan FIFO dan baca. Bacaan akan diblokir hingga anak keluar (untuk alasan apa pun) atau hingga memancarkan beberapa data. Jadi, Anda memerlukan sedikit putaran untuk membuang data teks yang tidak diinginkan.

Jika Anda memiliki akses ke sumber anak, buka FIFO untuk menulis saat dimulai dan kemudian lupakan saja. OS akan membersihkan deskriptor file yang terbuka saat anak berhenti dan proses "induk" Anda yang menunggu akan aktif.

Sekarang ini mungkin proses yang tidak Anda mulai atau miliki. Dalam hal ini, Anda dapat mengganti biner yang dapat dieksekusi dengan skrip yang memulai biner asli tetapi juga menambahkan pemantauan seperti yang dijelaskan di atas.


Sejauh ini saya telah menemukan tiga cara untuk melakukannya di Linux:

  • Polling:Anda sering memeriksa keberadaan proses, baik dengan menggunakan kill atau dengan menguji keberadaan /proc/$pid , seperti pada sebagian besar jawaban lainnya
  • Gunakan ptrace panggilan sistem untuk melampirkan ke proses seperti debugger sehingga Anda mendapat pemberitahuan saat keluar, seperti pada jawaban a3nm
  • Gunakan netlink antarmuka untuk mendengarkan PROC_EVENT_EXIT pesan - dengan cara ini kernel memberi tahu program Anda setiap kali proses keluar dan Anda hanya menunggu ID proses yang benar. Saya hanya melihat ini dijelaskan di satu tempat di internet.

Steker tak tahu malu:Saya sedang mengerjakan sebuah program (sumber terbuka tentu saja; GPLv2) yang melakukan salah satu dari ketiganya.


Tidak ada yang setara dengan wait() . Praktik yang biasa dilakukan adalah polling menggunakan kill(pid, 0) dan mencari nilai kembalian -1 dan errno dari ESRCH untuk menunjukkan bahwa proses tersebut telah hilang.

Perbarui: Sejak kernel linux 5.3 ada syscall pidfd_open, yang membuat fd untuk pid tertentu, yang dapat disurvei untuk mendapatkan notifikasi ketika pid telah keluar.


Linux
  1. Apa Proses Zombie Dan Bagaimana Menemukan &Membunuh Proses Zombie?

  2. 30 Latihan Proses Linux Untuk Sysadmin

  3. Bagaimana Cara Mencari Kode Keluar Untuk Aplikasi?

  1. Linux – Bagaimana Cara Berhenti Berbagi Jaringan Untuk Proses Saat Ini?

  2. Cara mengatur ID proses di Linux untuk program tertentu

  3. Cara menemukan file .pid untuk proses tertentu

  1. Cara Menginstal dan Mengonfigurasi Monit di Linux untuk Pemantauan Proses

  2. Bagaimana menemukan semua proses anak?

  3. Cara memeriksa ukuran heap untuk suatu proses di Linux