Latar belakang, zombie, daemon, dan tanpa ctty - apakah konsep-konsep ini terhubung?

8

Bagaimana konsep proses ini terkait bersama-sama - background, zombie, daemondan without controlling terminal?

Saya merasa bahwa mereka entah bagaimana dekat, terutama melalui konsep controlling terminal, tetapi masih belum banyak info bagi saya untuk menceritakan sebuah kisah, seperti jika Anda perlu menjelaskan sesuatu kepada seorang anak yang membaca artikel tentang Linux tanpa berbohong terlalu banyak.

PEMBARUAN # 1: Misalnya (saya tidak tahu apakah itu benar)

  • background- zombie- proses foreground tidak dapat menjadi zombie, karena zombiemerupakan proses latar belakang yang dibiarkan tanpa orangtua
  • daemon- without ctty- semua daemonsberjalan tanpa ctty, tapi tidak semua proses tanpa cttyyangdaemons
  • background- daemon- a background processdapat diambil untuk dijalankan kembali secara interaktif,daemon is not
  • zombie- without ctty- Tidak zombiepeduli apakah ada yang cttymelekat padanya atau tidak
  • background- without ctty- processesdikirim ke latar belakang saat mereka miliki ctty, dan menjadi daemon atau mati jika cttydiambil dari mereka
techtonik anatoly
sumber
Proses latar depan tentu saja bisa menjadi zombie, meskipun biasanya tidak untuk periode waktu yang cukup lama - cara yang biasa bagi shell (atau program lain) untuk menjalankan subproses di latar depan adalah dengan fork()menyalin salinan diri sendiri, gunakan exec()salinan itu. untuk menggantinya dengan apa yang ingin Anda jalankan, dan gunakan wait()dalam contoh asli program (bukan salinan yang berjalan exec()). Dalam periode waktu yang sangat, sangat singkat antara ketika anak keluar dan ketika wait()menuai status keluar (menghapusnya dari tabel proses dan mengembalikannya ke pemanggil), Anda memiliki zombie.
Charles Duffy
@CharlesDuffy apakah mungkin mengirim orang tua ke latar belakang sambil membiarkan anak berlari di latar depan?
anatoly techtonik
Dalam kontrol pekerjaan yang khas , cangkang bahkan tidak tahu bahwa cucu sama sekali terpisah dari anak langsungnya; itu hanya menunggu anaknya keluar, dan jika anak itu menunggu cucu keluar, itu urusan anak itu. Artinya - dari perspektif shell yang menelurkan induk, itu hanya berurusan dengan satu unit.
Charles Duffy

Jawaban:

10

Singkatnya, tautan plus.

zombie

sebuah proses yang telah keluar / diakhiri, tetapi orang tuanya belum mengakui penghentian (menggunakan wait()panggilan sistem). Proses mati disimpan dalam tabel proses sehingga orang tua mereka dapat diberitahu bahwa anak mereka dari proses anak keluar, dan status keluar mereka. Biasanya program forking anak-anak juga akan membaca status keluar mereka saat mereka keluar, jadi Anda akan melihat zombie hanya jika orang tua berhenti atau buggy.

Lihat:

mengendalikan terminal, sesi, latar depan, latar belakang

Ini terkait dengan kontrol pekerjaan dalam konteks shell yang berjalan di terminal. Seorang pengguna masuk, sesi dimulai, diikat ke terminal (terminal pengendali) dan sebuah shell dimulai. Shell kemudian menjalankan proses dan mengirimkannya pada latar depan dan latar belakang sesuai keinginan pengguna (menggunakan &saat memulai proses, menghentikannya dengan ^Z, menggunakan fgdan bg). Proses di latar belakang terhenti jika membaca atau menulis dari terminal; proses di latar depan menerima sinyal interupsi jika ^Cdipukul di terminal. (Ini adalah driver terminal kernel yang menangani sinyal-sinyal itu, shell mengontrol proses (grup) yang dikirim ke latar depan atau latar belakang.

Lihat:

daemon

Sebuah proses yang berjalan sebagai daemon biasanya adalah sesuatu yang tidak boleh diikat ke terminal tertentu (atau sesi login, atau shell). Seharusnya tidak memiliki terminal pengendali, sehingga tidak akan menerima sinyal jika terminal ditutup, dan orang biasanya tidak menginginkannya melakukan I / O pada terminal. Memulai daemon dari baris perintah membutuhkan pemutusan semua ikatan ke terminal, yaitu memulai sesi baru (dalam pengertian kontrol pekerjaan, di atas) untuk menyingkirkan terminal pengendali, dan menutup pegangan file ke terminal. Tentu saja sesuatu dimulai dari init, systemd atau serupa di luar sesi login tidak akan memiliki ikatan ini untuk memulai.

Karena daemon tidak memiliki terminal pengendali, itu tidak tunduk pada kontrol pekerjaan, dan berada di "latar depan" atau "latar belakang" dalam pengertian kontrol pekerjaan tidak berlaku. Juga, daemon biasanya adalah induk ulang inityang membersihkannya saat keluar, jadi Anda biasanya tidak melihatnya sebagai zombie.

Lihat:

ilkkachu
sumber
4

Zombie tidak benar-benar terkait dengan yang lain; itu hanyalah sebuah proses yang telah dihentikan, tetapi proses induknya belum membaca status keluarnya waitpid()atau sejenisnya. Anda seharusnya tidak melihat ini kecuali prosesnya bermasalah atau berhenti.

Sebuah daemon merupakan program yang berjalan tanpa terminal pengendali. Biasanya ketika Anda menjalankan program, itu fork()ssendiri, dan orang tua keluar sehingga shell mengira perintah telah selesai, dan proses anak melepaskan dari terminal dan lolos dari sesi login. Sejak proses induknya keluar, ID proses induknya menjadi 1, yang biasanya merupakan initprogram, atau belakangan ini systemd,. Proses ini memastikan untuk menuai anak-anaknya ketika mereka mati sehingga Anda tidak dibanjiri zombie.

Suatu proses dapat dikaitkan dengan terminal pengendali , yang mana ia biasanya mendapatkan input dari dan mengirimkan outputnya ke. Terminal juga dapat mengirim sinyal ke proses yang dilampirkan padanya, dan mengidentifikasi kelompok proses sebagai kelompok latar depan . Proses yang berada dalam kelompok latar depan diizinkan untuk membaca input dari terminal, dan dikirim sinyal SIGINT dan SIGSUSP ketika Anda menekan Ctrl-C dan Ctrl-Z. Setiap proses yang tidak dalam kelompok latar depan yang mencoba membaca dari terminal ditangguhkan dengan SIGTSTP.

Shell membuat grup proses yang berbeda untuk masing-masing perintah pipa yang Anda minta dijalankan, dan menggeser yang mana yang merupakan grup latar depan untuk memindahkan pekerjaan antara latar depan dan latar belakang. Ketika Anda menjalankan perintah, biasanya shell membuat grup proses baru dan membuat grup itu grup foreground . Jika Anda suffix dengan &shell maka hanya meninggalkan grup latar depan di mana ia dan kelompok baru di latar belakang. Menekan Ctrl-Z mengirim SIGSUSP ke grup latar depan, yang menyebabkan sebagian besar perintah ditunda, tetapi alih-alih menangguhkan, shell mengubah kelompok latar depan yang aktif kembali ke dirinya sendiri sehingga dapat meminta Anda untuk perintah baru.

The bgperintah mengirimkan SIGCONT untuk kelompok proses sehingga dapat kembali berjalan di latar belakang setelah ditangguhkan dengan SIGSUSP. fgmengubah grup latar depan ke salah satu grup yang sudah berjalan di latar belakang, membawanya ke latar depan.

psusi
sumber
4

Ok, inilah penjelasan saya dengan penekanan pada perbedaan antara jenis-jenis proses ini (singkat namun informatif):

  • zombie- proses yang baru saja keluar (selesai eksekusi) tetapi masih memiliki entri dalam tabel proses. Catatan : proses zombie masih memiliki orang tua dan biasanya inti keberadaannya adalah untuk membiarkan proses orang tua tahu tentang hasil eksekusi anak (kode keluar dll.).
  • disowned process(tanpa mengendalikan terminal) - proses yang baik secara eksplisit disownoleh pengguna atau dirancang untuk terlepas dari hierarki proses induk. Itu masih akan berjalan bahkan jika proses induk akan menyelesaikan eksekusi. Misalnya, pengguna sshmenggunakan mesin jarak jauh, memulai sesuatu seperti server web, kemudian jalankan disowndan keluar dari sshsesi. Proses masih akan berjalan karena itu bukan bagian dari pohon proses induk lagi. Proses juga dapat ditolak menjalankannya dengan nohup.
  • background process- berjalan di latar belakang - tidak membagi output ke tty pengguna. Entah dijalankan dengan &pada akhirnya, atau bercabang sendiri dengan latar belakang desain. Pilihan lain untuk mengirim suatu proses ke latar belakang adalah memulainya dan tekan ctrl+z. Namun, ketika proses induk akan berakhir, anak yang berjalan di latar belakang juga akan berakhir ( catatan oleh @psusi - fakta sebelumnya hanya benar dengan proses dimulai dari terminal oleh pengguna; jika tidak, proses anak menjadi 'anak yatim' dan mendapat proses init (pid 1) sebagai orang tua).
    • daemon- sangat mirip dengan proses latar belakang. Juga berjalan di latar belakang tetapi kemungkinan besar bercabang secara implisit (oleh desain). Biasanya ia duduk diam di latar menunggu beberapa bahkan terjadi dan hanya kemudian melakukan pekerjaan yang sebenarnya (koneksi masuk dll). Sebenarnya, daemon dapat dibongkar (lebih mungkin) dan proses latar belakang tergantung pada desainnya.

Semoga penjelasan ini akan membantu membedakan jenis proses ini.

ddnomad
sumber
Bagus. Tabel proses milik orang tua? Jadi zombie mati tanpa tuannya?
anatoly techtonik
Tabel bukan kata yang tepat. Ini agak proses tree. Ya, tentu saja, orang tua tidak terikat untuk mengakhiri setelah anak itu dihentikan (tetapi ia dapat melakukannya jika menunggu seorang anak untuk menyelesaikan pemrosesan beberapa hal). Tetapi jika orang tua akan berhenti - anak akan berhenti dengan pasti. Anda dapat lari topdari terminal Anda dan kemudian tekan shift-vuntuk melihat pohon proses di alam liar.
ddnomad
1
Pemberhentian orangtua tidak membunuh anak-anaknya. Anak-anak yatim memiliki ID proses orang tua mereka diubah menjadi init (1).
psusi
@psusi Anda benar, saya lupa bahwa itu hanya dimulai dengan proses di terminal. Saya akan memperbaiki jawaban saya.
ddnomad
Saya hanya akan menghapus kalimat "itu akan hilang dari meja segera". Ini menunjukkan bahwa entah bagaimana secara otomatis memudar setelah beberapa waktu, tetapi itu tidak terjadi; "menghilang" adalah peristiwa yang sangat konkret.
AnoE