Bagaimana konsep proses ini terkait bersama-sama - background
, zombie
, daemon
dan 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 menjadizombie
, karenazombie
merupakan proses latar belakang yang dibiarkan tanpa orangtuadaemon
-without ctty
- semuadaemons
berjalan tanpactty
, tapi tidak semua proses tanpactty
yangdaemons
background
-daemon
- abackground process
dapat diambil untuk dijalankan kembali secara interaktif,daemon is not
zombie
-without ctty
- Tidakzombie
peduli apakah ada yangctty
melekat padanya atau tidakbackground
-without ctty
-processes
dikirim ke latar belakang saat mereka milikictty
, dan menjadi daemon atau mati jikactty
diambil dari mereka
background-process
daemon
job-control
zombie-process
controlling-terminal
techtonik anatoly
sumber
sumber
fork()
menyalin salinan diri sendiri, gunakanexec()
salinan itu. untuk menggantinya dengan apa yang ingin Anda jalankan, dan gunakanwait()
dalam contoh asli program (bukan salinan yang berjalanexec()
). Dalam periode waktu yang sangat, sangat singkat antara ketika anak keluar dan ketikawait()
menuai status keluar (menghapusnya dari tabel proses dan mengembalikannya ke pemanggil), Anda memiliki zombie.Jawaban:
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:
waitpid(2)
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
, menggunakanfg
danbg
). Proses di latar belakang terhenti jika membaca atau menulis dari terminal; proses di latar depan menerima sinyal interupsi jika^C
dipukul 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
init
yang membersihkannya saat keluar, jadi Anda biasanya tidak melihatnya sebagai zombie.Lihat:
daemon(7)
.sumber
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()s
sendiri, 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 merupakaninit
program, atau belakangan inisystemd
,. 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
bg
perintah mengirimkan SIGCONT untuk kelompok proses sehingga dapat kembali berjalan di latar belakang setelah ditangguhkan dengan SIGSUSP.fg
mengubah grup latar depan ke salah satu grup yang sudah berjalan di latar belakang, membawanya ke latar depan.sumber
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 eksplisitdisown
oleh pengguna atau dirancang untuk terlepas dari hierarki proses induk. Itu masih akan berjalan bahkan jika proses induk akan menyelesaikan eksekusi. Misalnya, penggunassh
menggunakan mesin jarak jauh, memulai sesuatu seperti server web, kemudian jalankandisown
dan keluar darissh
sesi. Proses masih akan berjalan karena itu bukan bagian dari pohon proses induk lagi. Proses juga dapat ditolak menjalankannya dengannohup
.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 tekanctrl+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.
sumber
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 laritop
dari terminal Anda dan kemudian tekanshift-v
untuk melihat pohon proses di alam liar.