Mengapa beberapa program berjalan dari Terminal menggunakan '&' menutup ketika Terminal tidak dan yang lain tidak?

27

Saya hanya ingin tahu, misalnya ketika saya memulai qtoxdengan:

qtox &

Dan kemudian tutup Terminal, qtoxtutup dengan itu. Namun saat berjalan etherapemenggunakan:

sudo etherape &

Closing Terminal tidak menutup atau menyebabkan masalah pada Etherape. Dan di antara aplikasi yang berbeda ada perilaku yang berbeda, beberapa tutup ketika Terminal tidak, yang lain tidak, bagaimana bisa? Mengapa beberapa orang tutup ketika yang lain tidak? Saya menjalankan Ubuntu GNOME 15.10 dengan GNOME 3.18.

kos
sumber
1
Mungkinkah Anda membuka terminal, Anda menjalankan qtox, Anda menutup terminal, semuanya !! Tetapi yang kedua pergi Anda membuka terminal, sudo menjalankan etherape, sekarang Anda menutup terminal Anda, tetapi sudo terus berjalan sampai sudo ditutup?
Ken Mollerup
Nah, jika Anda tidak ingin qtoxkeluar ketika Anda menutup terminal, Anda selalu dapat menjalankannya nohup qtox &.
Terrance
@Terrance: Ya, dalam pertanyaan ini saya secara khusus bertanya mengapa, bukan bagaimana ... Itu akan menjadi pertanyaan saya yang lain ... :)
1
@ParanoidPanda Ah, poin bagus. Salahku. =)
Terrance

Jawaban:

36

Ketika Anda menutup terminal, terminal mengirimkan sinyal SIGHUP ke shell; shell, pada gilirannya, mengirimkan sinyal SIGHUP ke semua kelompok proses anak-anaknya, yang mencakup kelompok proses berlatar belakang;

Bagaimana setiap proses akan bereaksi terhadap sinyal sepenuhnya tergantung pada proses: jika proses tidak mendefinisikan handler untuk sinyal dan memberi tahu kernel (melalui beberapa syscall seperti signal()atau sigaction()) bahwa ia ingin menanganinya, kernel mengeksekusi pengendali default untuk sinyal, yang dalam hal sinyal SIGHUP terdiri dalam mengakhiri proses.

Namun, ketika Anda menjalankan perintah sudo, UID dari sudoproses dan proses anaknya diatur ke 0(root); secara umum, kecuali UID dari proses pengiriman sinyal adalah 0(root) atau sama dengan proses target, kernel menolak sinyal (yaitu: suatu proses tidak dapat mengirim sinyal ke proses yang dimiliki oleh pengguna lain, kecuali proses mengirim sinyal dimiliki oleh root); itu sebabnya proses yang dijalankan oleh pengguna seperti instance Bash yang dijalankan oleh terminal tidak dapat SIGHUP sudoproses dan, akhirnya, menutup terminal tidak mempengaruhi proses yang dimulai dengan sudo.

kos
sumber
7
Dan itulah mengapa kita perlu nohupdi depan perintah-perintah yang dekat dengan SIGHUP :) Disegangkan
Sergiy Kolodyazhnyy
9
Saya pikir tidak ada keajaiban tentang sudo. sudohanya menjalankan perintah sebagai pengguna lain dan Anda tidak dapat mengirim sinyal ke proses pengguna lain. Lihat man 2 kill.
el.pescado
@ el.pescado Jadi, sudosemacam orang miskin nohup?
Hagen von Eitzen
7
@HagenvonEitzen Jika Anda mau, tapi saya akan sangat menahan diri dari menjalankan perintah yang tidak diperlukan sudodengan sudountuk efek nohupsampingnya, mempertimbangkan semua kerugian lainnya.
kos
2
@Serg kita tidak perlu nohup, itu membuat nohup.outfile yang tidak dibutuhkan setelahnya. Alih-alih menggunakan disownperintah builtin.
Ruslan