Apa perbedaannya
$ nohup foo
dan
$ foo &
dan
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
sumber
sumber
foo &!
yang harus sama dengan menolaknya sejak awal.foo & disown
untuk disangkal segera.setsid
, dan bagaimana kaitannya dengandisown
dannohup
Jawaban:
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 mengetikfoo
:foo
dibuat.SIGHUP
, shell juga mengirimkanSIGHUP
ke proses (yang biasanya menyebabkan proses berakhir).Sekarang, mari kita lihat apa yang terjadi jika Anda meletakkan proses di latar belakang, yaitu, ketik
foo &
:foo
dibuat.jobs
dan dapat diakses menggunakan%n
(di manan
nomor pekerjaan).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).SIGHUP
, itu juga mengirimkanSIGHUP
ke proses. Tergantung pada shell dan mungkin pada opsi yang ditetapkan untuk shell, ketika mengakhiri shell itu juga akan mengirimSIGHUP
ke proses.Sekarang
disown
hapus pekerjaan dari daftar pekerjaan shell, jadi semua subpoint di atas tidak berlaku lagi (termasuk proses yang dikirimSIGHUP
oleh shell). Namun perlu dicatat bahwa itu masih terhubung ke terminal, jadi jika terminal dihancurkan (yang dapat terjadi jika itu pty, seperti yang dibuat olehxterm
ataussh
, 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:EOF
).nohup.out
, sehingga program tidak akan gagal untuk menulis ke output standar jika terminal gagal, sehingga apa pun proses penulisan tidak hilang.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 depannohup
pekerjaan lebih atau kurang berguna, Anda akan umumnya memasukkannya ke dalam latar belakang menggunakan&
). Misalnya, tidak seperti dengandisown
, 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 mengirimkannyaSIGHUP
. 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 kenohup.out
dan melindunginya dariSIGHUP
. Salah satu efek (penamaan) adalah bahwa proses tidak akan menerima pengiriman apa punSIGHUP
. Ini sepenuhnya independen dari kontrol pekerjaan dan pada prinsipnya dapat digunakan juga untuk pekerjaan latar depan (meskipun itu tidak terlalu berguna).sumber
nohup
sendiri tidak menyimpan proses google-chrome dari ditutup, ketika terminal dari mana ia dimulai ditutup ?disown %1
dandisown -h %1
? Yang kedua akan tetap sebagai pekerjaan biasa (tetapi mengabaikan sinyal HUP) sampai terminal keluar?(foo&)
subkulitMenggunakan
&
menyebabkan program berjalan di latar belakang, sehingga Anda akan mendapatkan prompt shell baru alih-alih memblokir sampai program berakhir.nohup
dandisown
sebagian besar tidak terkait; mereka menekan sinyal SIGHUP (hangup) sehingga program tidak mati secara otomatis ketika terminal pengendali ditutup.nohup
melakukan ini ketika pekerjaan pertama dimulai. Jika Anda tidak melakukannohup
pekerjaan saat dimulai, Anda dapat menggunakandisown
untuk memodifikasi pekerjaan yang sedang berjalan; tanpa argumen itu memodifikasi pekerjaan saat ini, yang merupakan hanya latar belakangsumber
nohup
dandisown
keduanya dapat dikatakan menekanSIGHUP
, tetapi dengan cara yang berbeda.nohup
membuat program mengabaikan sinyal awalnya (program dapat mengubah ini).nohup
juga mencoba mengatur agar program tidak memiliki terminal pengendali, sehingga tidak akan dikirimSIGHUP
oleh kernel ketika terminal ditutup.disown
murni internal ke shell; itu menyebabkan shell tidak mengirimSIGHUP
ketika itu berakhir.disown
menghapus pekerjaan dari daftar pekerjaan. Jika Anda tidak menentukan opsi, itu menghapusnya dari daftar pekerjaan. Namun , jika Anda menentukan-h
opsi, setiap jobspec tidak dihapus dari tabel. Sebagai gantinya, ia membuatnya agarSIGHUP
tidak dikirim ke pekerjaan jika shell menerima aSIGHUP
.&
tidak memberi Anda terminal, itu terlepasstdin
dari proses dan menyebabkannya berjalan di latar belakang, tetapi keduanyastdout
danstderr
masih melekat pada tty saat ini. Ini berarti Anda mungkin mendapatkan teks dari berbagai program yang digabungkan, yang bisa sangat menjengkelkan jika Anda melakukangimp &
dan mendapatkan banyak kesalahan GTK + saat mencoba menggunakan tty itu untuk sesuatu yang lain.Inilah pengalaman saya mencoba menjalankan soffice di latar belakang, mengikuti perintah yang tidak berakhir (mis
tail
.). Untuk contoh ini saya akan gunakansleep 100
.&
tidak ... &
& ditolak
setid .. &
Untuk menghemat ruang::
nohup setsid ..
tidak menampilkan log / soffice JANGAN BERHENTI Ctrl-Cnohup
dengan& disown
pada akhirnya: tidak menunjukkan log / soffice berhenti aktif Ctrl-Csumber
nohup ⟨command⟩ & disown
proses yang dibuat tidak berhentiCtrl+C
.soffice
?soffice
Perintah sepertinya memiliki sesuatu yang berbeda. Jadi saya mempertimbangkan untuk menambahkannya di sini sebagai pengecualian aturan. misalnya ketika menggunakannohup .. &
:, menekan secaraCtrl-c
normal tidak menyebabkan perintah berhenti, tetapi dengansoffice
itu tidak. Saya menunggu sampai seseorang menginjak ini dan menjelaskan mengapa ini terjadi dengan soffice :)nohup soffice &
dan menekanCtrl+C
. Tidak ada yang terjadi, seperti yang diharapkan.