it-swarm-id.com

Perbedaan antara Nohup, disown dan &

Apa perbedaannya

$ Nohup foo

dan

$ foo &

dan

$ foo & 
$ disown
600
lesmana

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 menjalankan foo dibuat.
  • Proses mewarisi stdin, stdout, dan stderr dari Shell. Karena itu juga terhubung ke terminal yang sama.
  • Jika Shell menerima 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 menjalankan 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.
  • Itu 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 adalah nomor pekerjaan).
    • Ini dapat diubah menjadi pekerjaan latar depan menggunakan fg, dalam hal ini terus berlanjut seolah-olah Anda tidak akan menggunakan & di atasnya (dan jika dihentikan karena mencoba membaca dari input standar, sekarang dapat melanjutkan membaca dari terminal).
    • Jika Shell menerima SIGHUP, Shell juga mengirimkan SIGHUP ke proses. Bergantung pada Shell dan mungkin pada opsi yang ditetapkan untuk Shell, ketika mengakhiri Shell itu juga akan mengirim SIGHUP ke proses.

Sekarang disown menghapus pekerjaan dari daftar pekerjaan Shell, jadi semua subpoin di atas tidak berlaku lagi (termasuk proses pengiriman SIGHUP oleh Shell). Namun perhatikan 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 diakhiri, dengan menutup xterm atau mengakhiri SSH koneksi), program akan gagal segera setelah mencoba membaca dari input standar atau menulis ke output standar.

Apa yang Nohup lakukan adalah, secara terpisah memisahkan proses dari terminal:

  • Ini menutup input standar (program akan tidak 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, jadi program tidak akan gagal untuk menulis ke output standar jika terminal gagal, jadi apa pun proses penulisan tidak hilang.
  • Ini mencegah proses dari menerima SIGHUP (dengan demikian namanya).

Perhatikan bahwa Nohup tidak tidak menghapus proses dari kontrol pekerjaan Shell dan juga tidak meletakkannya di latar belakang (tetapi karena foreground Nohup pekerjaan lebih atau kurang berguna, Anda biasanya akan meletakkannya di latar belakang menggunakan &). Misalnya, tidak seperti dengan disown, Shell masih akan memberi tahu Anda ketika pekerjaan Nohup telah selesai (kecuali jika Shell dihentikan 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 akan mengirimkannya SIGHUP. Jelas, ini 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 SIGHUP. Ini sepenuhnya independen dari kontrol pekerjaan dan pada prinsipnya dapat digunakan juga untuk pekerjaan latar depan (meskipun itu tidak terlalu berguna).
595
celtschk

Menggunakan & menyebabkan program berjalan di latar belakang, jadi Anda akan mendapatkan Shell Prompt baru alih-alih mencekal hingga program berakhir. Nohup dan disown sebagian besar tidak berhubungan; mereka menekan sinyal SIGHUP (hangup) sehingga program tidak mati secara otomatis ketika terminal pengendali ditutup. Nohup melakukan ini saat pekerjaan pertama dimulai. Jika Anda tidak Nohup pekerjaan saat dimulai, Anda dapat menggunakan disown untuk mengubah pekerjaan yang sedang berjalan; tanpa argumen itu memodifikasi pekerjaan saat ini, yang merupakan hanya latar belakang

174
Michael Mrozek

Berikut adalah pengalaman saya mencoba menjalankan soffice di latar belakang, mengikuti perintah non-terminating (mis. tail). Untuk contoh ini saya akan menggunakan sleep 100.

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I lihat soffice log/dengan menekan Ctrl-C soffice stops

Nohup .. &

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Saya tidak melihat soffice log/dengan menekan Ctrl-C soffice berhenti

& ditolak

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

I lihat soffice log/dengan menekan Ctrl-C soffice stops

setid .. &

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I lihat soffice log/dengan menekan Ctrl-C soffice TIDAK BERHENTI

Untuk menghemat ruang:
Nohup setsid ..: tidak menampilkan log/soffice JANGAN BERHENTI Ctrl-C
Nohup dengan & disown di akhir: tidak menampilkan log/soffice berhenti aktif Ctrl-C

9
Marinos An