Pertama pertanyaan ini terkait tetapi jelas tidak sama dengan pertanyaan yang sangat bagus ini:
Perbedaan antara nohup, disown, & &
Saya ingin memahami sesuatu: ketika saya melakukan '&', saya forking kan?
Apakah pernah berguna untuk melakukan "nohup ... &" atau hanya & cukup?
Bisakah seseorang menunjukkan case di mana Anda akan menggunakan '&' dan masih ingin menggunakan 'nohup'?
nohup
dilakukannya. Bagian mana yang membuat Anda bingung?Jawaban:
Pertama-tama, setiap kali Anda menjalankan perintah, Anda shell akan melakukan proses baru, terlepas dari apakah Anda menjalankannya
&
atau tidak.&
hanya berarti Anda menjalankannya di latar belakang.Perhatikan ini tidak terlalu akurat. Beberapa perintah, seperti
cd
fungsi shell dan biasanya tidak akan melakukan proses baru.type cmd
biasanya akan memberi tahu Anda apakahcmd
itu perintah eksternal atau fungsi shell.type type
memberitahu Anda bahwatype
itu sendiri adalah fungsi shell.nohup
adalah sesuatu yang berbeda. Ini memberitahu proses baru untuk diabaikanSIGHUP
. Ini adalah sinyal yang dikirim oleh kernel ketika shell induk ditutup.Untuk menjawab pertanyaan Anda lakukan hal berikut:
emacs &
(secara default seharusnya dijalankan di jendela X terpisah) .exit
.Anda akan melihat bahwa
emacs
jendela terbunuh, meskipun berjalan di latar belakang. Ini adalah perilaku default dannohup
digunakan tepat untuk memodifikasi itu.Menjalankan pekerjaan di latar belakang (dengan
&
ataubg
, saya yakin shell lain memiliki sintaks lain juga) adalah fitur shell, yang berasal dari kemampuan sistem modern untuk multitask. Alih-alih forking contoh shell baru untuk setiap program yang Anda ingin peluncuran, kerang modern (bash
,zsh
,ksh
, ...) akan memiliki kemampuan untuk mengelola daftar program (atau pekerjaan ). Hanya satu dari mereka pada satu waktu yang dapat berada di latar depan , artinya itu mendapatkan fokus shell. Saya berharap seseorang dapat lebih memperluas perbedaan antara proses yang berjalan di latar depan dan satu di latar belakang (yang utama adalah akses kestdin
/stdout
).Bagaimanapun, ini tidak mempengaruhi cara anak bereaksi
SIGHUP
.nohup
tidak.sumber
SIGHUP
ke anaknya proses ketika shell itu sendiri menerimaSIGHUP
, bukan ketika shell keluar secara normal. bash memiliki opsihuponexit
yang menyebabkannya mengirimSIGHUP
ke anak-anak ketika keluar, tetapi itu tidak diaktifkan secara default. gnu.org/software/bash/manual/bashref.html#Signals&
dan menutup shell saya dengan menjalankanexit
. Prosesnya masih berjalan. Ada ide mengapa itu belum terbunuh? Atau saya melewatkan sesuatu di sini?Apakah ini berguna untuk dilakukan
nohup ... &
? Iya nih. Jika Anda baru saja memulai proses "di latar belakang" dengan&
, proses baru itu masih memiliki keanggotaan dalam "grup proses" shell asli. Jika shell atau grup proses mendapatkan sinyal tertentu (SIGHUP, misalnya), secara default mereka keluar. Ini berarti bahwa jika Anda menjalankan proses dengan&
dari shell yang dimulai oleh xterm, atau rxvt atau emulator terminal windowing lain, ketika Anda menutup jendela, proses latar belakang mendapatkan SIGHUP. Kebanyakan kode yang ditulis dengan santai tidak menangani SIGHUP, dan karenanya keluar.Jika Anda melakukannya
nohup ... &
,nohup
perintah menetapkan SIGHUP untuk diabaikan, dan kemudian jalankan perintah. Perintah yang baru dijalankan itu menjaga penutup sinyal yang disetelnohup
, kecuali jika perintah melakukan beberapa penanganan sinyal sendiri. Jika Anda menutup xterm atau rxvt atau apa pun, kernel akan mengirimkan SIGHUP ke proses perintah, yang diabaikan. Itu terus berjalan.Melakukan
nohup
perintah pada memungkinkannya untuk tetap berjalan setelah Anda menutup xterm, atau Anda logout.sumber
&
dengannohup
membuat perintah tetap berjalan dalam kasus tertentu di mana hanya menggunakannohup
tidak akan? Itu tampaknya bertentangan dengan jawabannya di sini: unix.stackexchange.com/a/288064/1822nohup
beberapa hal sebelumexec()
panggilan sistem untuk membuat proses bercabang mengabaikan sinyal tertentu. Jadi, ya, "&" akan memungkinkan perintah dijalankan dalam keadaan tertentu yangnohup
tidak akan dilakukan oleh orang tua biasa . Seperti menutup xterm yang terkait dengan shell yang melakukan nohup, atau log off.jika Anda menjalankan program di latar belakang (dengan & sebagai akhiran) di sistem operasi linux dan logout bahkan setelah itu ia akan tetap berjalan: coba dengan:
Setelah login kembali periksa jumlah baris dalam file output
ping_result
yang akan terus bertambah berarti masih berjalan namun telah diberitahu bahwa itu akan ditutup. lalu apa gunanyanohup
perintah.Skenario lain ==> seperti yang dinyatakan di atas untuk
nohup emac &
-> yang harus tetapemac
berjalan setelah keluar sistem tetapi tidak menunjukkan berjalan setelah masuk kembali.sumber