Mengapa PGID anak saya memproses bukan PID orang tua?

13

Jadi saya terus membaca di mana-mana bahwa perintah ini harus menghentikan semua proses anak dari proses induk:

kill -- -$$

Menggunakan ID negatif dengan perintah kill merujuk pada PGID dan dari contoh yang saya lihat nampak bahwa PGID dari proses anak harus menjadi PID dari induk tetapi bukan itu yang terjadi pada sistem saya.

Di sistem saya, PGID anak sama dengan PGID skrip induk yang ternyata bash.

Apa yang terjadi di sini? Apakah contohnya salah atau sistem saya diatur secara berbeda?

Apa yang perlu saya capai adalah menghentikan proses anak tanpa menghentikan orang tua jadi saya tidak ingin mengirim sinyal mematikan ke PGID tempat orang tua berada.

TCZ8
sumber

Jawaban:

11

Saya pikir maksud Anda PGID, yang merupakan singkatan dari ID Grup Proses .

Saat suatu proses bercabang, ia mewarisi PGID-nya dari induknya. PGID berubah ketika suatu proses menjadi pemimpin grup proses , kemudian PGID-nya disalin dari PID-nya. Sejak saat itu, anak baru memprosesnya, dan keturunan mereka, mewarisi PGID itu (kecuali mereka memulai kelompok proses baru mereka sendiri).

Dalam sebuah shell dengan kontrol pekerjaan, seperti kebanyakan shell interaktif, setiap pekerjaan diletakkan dalam kelompok prosesnya sendiri. Jika Anda menjalankan skrip shell, proses shell menjalankan skrip akan menjadi pemimpin grup, dan PGID akan sama dengan PID-nya.

Dalam sebuah shell tanpa kontrol pekerjaan, seperti kebanyakan shell yang digunakan untuk menjalankan skrip, perintah dijalankan di grup proses shell.

Sintaksnya kill -- -Nmembunuh semua proses dalam grup dengan PGID = N. Anda tidak dapat menggunakannya dengan PID sewenang-wenang, hanya PID dari pemimpin grup proses, karena itulah PGID. Ini pada dasarnya bagaimana shell

kill %jobid

sintaks berfungsi - itu diterjemahkan secara internal %jobidke PGID pekerjaan dan mengirimkan sinyal ke PGID itu.

Tidak ada cara sederhana untuk menjalankan skrip di grup prosesnya sendiri dari skrip shell lain. Lihat Cara mengatur grup proses skrip shell untuk beberapa saran.

Barmar
sumber
Apakah Anda mengatakan bahwa shell dengan atau tanpa kontrol pekerjaan melakukan hal yang sama?
TCZ8
1
Tidak. Sebuah shell dengan kontrol pekerjaan memulai grup proses baru untuk setiap pekerjaan. Shell tanpa kontrol pekerjaan tidak memulai grup proses baru untuk setiap pekerjaan, ia menjalankannya dalam grup prosesnya sendiri.
Barmar
wow .. saya tidak membacanya pertama kali. Jadi saya kira yang saya inginkan adalah menyalakan kontrol kerja? Apakah itu memastikan bahwa anak-anak memiliki PGID yang cocok dengan PID dari skrip induk? Atau akankah masing-masing anak mendapatkan PGID unik mereka sendiri?
TCZ8
Saya menemukan beberapa dokumen online di kontrol pekerjaan, saya tidak akan melalui itu. Terima kasih atas bantuan Anda, Barmar.
TCZ8
1
Dengan kontrol pekerjaan, setiap anak mendapatkan PGID sendiri. Tanpa kontrol pekerjaan, mereka mewarisi PGID dari orang tua. Tapi orang tua mungkin telah mewarisi PGID nya dari yang tua, jika itu bukan pemimpin kelompok proses.
Barmar