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
foo
dibuat.
- Proses mewarisi stdin, stdout, dan stderr dari shell. Karena itu juga terhubung ke terminal yang sama.
- Jika shell menerima a
SIGHUP
, shell juga mengirimkan SIGHUP
ke 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
foo
dibuat.
- 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
jobs
dan dapat diakses menggunakan %n
(di mana n
nomor 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 SIGHUP
ke proses. Tergantung pada shell dan mungkin pada opsi yang ditetapkan untuk shell, ketika mengakhiri shell itu juga akan mengirim SIGHUP
ke proses.
Sekarang disown
hapus pekerjaan dari daftar pekerjaan shell, jadi semua subpoint di atas tidak berlaku lagi (termasuk proses yang dikirim SIGHUP
oleh shell). Namun perlu dicatat bahwa itu masih terhubung ke terminal, jadi jika terminal dihancurkan (yang dapat terjadi jika itu pty, seperti yang dibuat oleh xterm
atau 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 nohup
dilakukan, 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 nohup
tidak tidak menghapus proses dari kontrol pekerjaan shell dan juga tidak meletakkannya di latar belakang (tapi karena latar depan nohup
pekerjaan 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.
disown
menghapus 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.
nohup
memutus proses dari terminal, mengalihkan hasilnya ke nohup.out
dan 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).