Pertama mari kita lihat apa yang terjadi jika suatu program dimulai dari shell interaktif (terhubung ke terminal) tanpa &(dan tanpa pengalihan). Jadi mari kita asumsikan Anda baru saja mengetik foo:
- Proses yang berjalan
foodibuat.
- Proses mewarisi stdin, stdout, dan stderr dari shell. Karena itu juga terhubung ke terminal yang sama.
- Jika shell menerima a
SIGHUP, shell juga mengirimkan SIGHUPke proses (yang biasanya menyebabkan proses berakhir).
- Kalau tidak, shell menunggu (diblokir) sampai proses berakhir.
Sekarang, mari kita lihat apa yang terjadi jika Anda meletakkan proses di latar belakang, yaitu, ketik foo &:
- Proses yang berjalan
foodibuat.
- Proses ini mewarisi stdout / stderr dari shell (sehingga masih menulis ke terminal).
- Proses pada prinsipnya juga mewarisi stdin, tetapi begitu ia mencoba membaca dari stdin, ia dihentikan.
- Ini dimasukkan ke dalam daftar pekerjaan latar belakang yang dikelola shell, yang artinya terutama:
- Itu terdaftar dengan
jobsdan dapat diakses menggunakan %n(di mana nnomor pekerjaan).
- Ini dapat diubah menjadi pekerjaan latar depan menggunakan
fg, dalam hal ini terus berlanjut seolah-olah Anda tidak akan menggunakannya &(dan jika dihentikan karena mencoba membaca dari input standar, sekarang dapat melanjutkan membaca dari terminal).
- Jika shell menerima
SIGHUP, itu juga mengirimkan SIGHUPke proses. Tergantung pada shell dan mungkin pada opsi yang ditetapkan untuk shell, ketika mengakhiri shell itu juga akan mengirim SIGHUPke proses.
Sekarang disownhapus pekerjaan dari daftar pekerjaan shell, jadi semua subpoint di atas tidak berlaku lagi (termasuk proses yang dikirim SIGHUPoleh shell). Namun perlu dicatat bahwa itu masih terhubung ke terminal, jadi jika terminal dihancurkan (yang dapat terjadi jika itu pty, seperti yang dibuat oleh xtermatau ssh, dan program pengendali dihentikan, dengan menutup xterm atau mengakhiri koneksi SSH ) , program akan gagal segera setelah mencoba membaca dari input standar atau menulis ke output standar.
Apa yang nohupdilakukan, di sisi lain, adalah untuk secara efektif memisahkan proses dari terminal:
- Ini menutup input standar (program tidak akan dapat membaca input apa pun, bahkan jika dijalankan di latar depan. Itu tidak dihentikan, tetapi akan menerima kode kesalahan atau
EOF).
- Ini mengarahkan output standar dan kesalahan standar ke file
nohup.out, sehingga program tidak akan gagal untuk menulis ke output standar jika terminal gagal, sehingga apa pun proses penulisan tidak hilang.
- Ini mencegah proses dari menerima
SIGHUP(dengan demikian nama).
Perhatikan bahwa nohuptidak tidak menghapus proses dari kontrol pekerjaan shell dan juga tidak meletakkannya di latar belakang (tapi karena latar depan nohuppekerjaan lebih atau kurang berguna, Anda akan umumnya memasukkannya ke dalam latar belakang menggunakan &). Misalnya, tidak seperti dengan disown, shell masih akan memberi tahu Anda ketika pekerjaan nohup telah selesai (kecuali jika shell sudah diakhiri sebelumnya, tentu saja).
Jadi untuk meringkas:
& menempatkan pekerjaan di latar belakang, yaitu, membuatnya memblokir upaya membaca input, dan membuat shell tidak menunggu penyelesaiannya.
disownmenghapus proses dari kontrol pekerjaan shell, tetapi masih membiarkannya terhubung ke terminal. Salah satu hasilnya adalah shell tidak mau mengirimkannya SIGHUP. Jelas, itu hanya dapat diterapkan pada pekerjaan latar belakang, karena Anda tidak dapat memasukkannya saat pekerjaan latar depan sedang berjalan.
nohupmemutus proses dari terminal, mengalihkan hasilnya ke nohup.outdan melindunginya dari SIGHUP. Salah satu efek (penamaan) adalah bahwa proses tidak akan menerima pengiriman apa pun SIGHUP. Ini sepenuhnya independen dari kontrol pekerjaan dan pada prinsipnya dapat digunakan juga untuk pekerjaan latar depan (meskipun itu tidak terlalu berguna).