Suatu proses tidak "dibunuh dengan SIGHUP" - setidaknya, tidak dalam arti sebenarnya. Sebaliknya, saat koneksi terputus, proses pengendalian terminal (dalam hal ini, Bash) dikirimi sinyal hang-up*, yang biasanya disingkat "sinyal HUP", atau hanya SIGHUP.
Sekarang, ketika sebuah proses menerima sinyal, ia dapat menanganinya sesuai keinginannya**. Default untuk sebagian besar sinyal (termasuk HUP) adalah segera keluar. Namun, program bebas mengabaikan sinyal, atau bahkan menjalankan semacam fungsi penangan sinyal.
Bash memilih opsi terakhir. Penangan sinyal HUP memeriksa untuk melihat apakah opsi "huponexit" benar, dan jika demikian, mengirimkan SIGHUP ke setiap proses anaknya. Hanya setelah selesai, Bash keluar.
Demikian pula, setiap proses turunan bebas melakukan apa pun yang diinginkannya saat menerima sinyal:biarkan disetel ke default (yaitu langsung mati), abaikan, atau jalankan penangan sinyal.
Nohup hanya mengubah tindakan default untuk proses anak menjadi "abaikan". Namun, setelah proses anak berjalan, ia bebas mengubah responsnya sendiri terhadap sinyal.
Ini, menurut saya, adalah mengapa beberapa program mati meskipun Anda menjalankannya dengan nohup:
- Nohup menyetel tindakan default ke "abaikan".
- Program perlu melakukan semacam pembersihan saat keluar, jadi program akan menginstal penangan SIGHUP, yang kebetulan menimpa flag "abaikan".
- Saat SIGHUP tiba, pengendali berjalan, membersihkan file data program (atau apa pun yang perlu dilakukan) dan keluar dari program.
- Pengguna tidak mengetahui atau peduli dengan penangan atau pembersihan, dan hanya melihat bahwa program keluar meskipun tidak ada.
Di sinilah "disown" masuk. Proses yang telah ditolak oleh Bash tidak pernah mengirimkan sinyal HUP, terlepas dari opsi huponexit. Jadi, meskipun program mengatur penangan sinyalnya sendiri, sinyal tidak pernah benar-benar terkirim, sehingga penangan tidak pernah berjalan. Namun, perhatikan bahwa jika program mencoba menampilkan beberapa teks kepada pengguna yang keluar, itu akan menyebabkan kesalahan I/O, yang dapat menyebabkan program tetap keluar.
* Dan, ya, sebelum Anda bertanya, terminologi "hang-up" tersisa dari hari-hari dialup mainframe UNIX.
** Kebanyakan sinyal. SIGKILL, misalnya, selalu menyebabkan program segera berhenti, titik.
Poin 1-4 benar. Saya tidak tahu apa-apa tentang poin 5. Adapun poin terakhir Anda, aplikasi yang bagus, layar , akan memungkinkan Anda untuk membiarkan semua proses berjalan secara alami, terlepas dari bagaimana Anda mengakhiri koneksi Anda. Layar ada di repo.
Deskripsi layar pria tidak mudah dibaca, tetapi, antara lain, menyatakan:
Ketika layar dipanggil, itu membuat satu jendela dengan shell di dalamnya (atau perintah yang ditentukan) dan kemudian menyingkir sehingga Anda dapat menggunakan program seperti biasa. Kemudian, kapan saja, Anda dapat membuat jendela baru (layar penuh) dengan program lain di dalamnya (termasuk lebih banyak cangkang), mematikan jendela yang ada, melihat daftar jendela, mengaktifkan dan menonaktifkan keluaran log, salin dan tempel teks antara jendela, lihat riwayat scrollback, beralih antar jendela dengan cara apa pun yang Anda inginkan, dll. Semua jendela menjalankan programnya sepenuhnya independen satu sama lain.Program terus berjalan saat jendelanya saat ini tidak terlihat dan bahkan saat seluruh layar sesi terlepas dari terminal pengguna . Saat sebuah program berhenti, layar (per default) mematikan jendela yang memuatnya. Jika jendela ini berada di latar depan, tampilan beralih ke jendela sebelumnya; jika tidak ada yang tersisa, layar keluar.
Saya telah menyoroti bagian terpenting:Anda dapat melepaskan jendela dengan perintah Ctrl+a+d, dan kemudian Anda dapat mematikan/keluar dari sesi Anda, dan jendela yang sekarang terlepas akan terus hidup, dengan program di dalamnya masih berjalan. Saat Anda terhubung kembali, misalnya dengan memulai sesi ssh baru, perintah screen -r akan melanjutkan sesi layar yang telah dilepas sebelumnya, dengan semua keluaran ke kesalahan standar/keluaran terlihat jelas.