Pertanyaan ini sudah lama, dan saya masih belum jelas mengapa.
Pertanyaan asli pada tahun 2014:
Di tab Terminal Gnome, saya berlari
$ nohup chromium-browser &
Tetapi ketika saya menutup tab terminal, chromium-browser
juga keluar. Bukankah nohup
seharusnya mencegah itu? Gilles berkata:
nohup dan ditolak keduanya dapat dikatakan untuk menekan SIGHUP, tetapi dengan cara yang berbeda. nohup membuat program mengabaikan sinyal pada awalnya (program dapat mengubah ini). nohup juga mencoba mengatur agar program tidak memiliki terminal pengendali, sehingga tidak akan dikirim SIGHUP oleh kernel ketika terminal ditutup. penolakan adalah murni internal ke shell; itu menyebabkan shell tidak mengirim SIGHUP ketika itu berakhir.
Jadi bukankah tidak membuat kromium-browser mengabaikan SIGHUP?
Saya melihat ini di executable lain juga, seperti dan Emacs (mode GUI). Tapi tidak pada xeyes.
Ini terjadi pada Ubuntu 12.04, 32-bit ketika pertanyaan diposting.
Pembaruan pada tahun 2015,
Sekarang saya menjalankan Ubuntu 14.04, dengan google-chrome
bukannya chromium-browser
diinstal. Hal yang sama yang terjadi pada chromium-browser sebelumnya juga terjadi pada google-chrome sekarang. nohup google-chrome 2>/dev/null &
tidak menyimpannya agar tidak ditutup ketika tab terminal ditutup. /usr/bin/google-chrome
adalah tautan ke skrip bash /opt/google/chrome/google-chrome
. Mengapa nohup
diterapkan pada skrip bash tidak berfungsi? Bagaimana kami bisa membuatnya bekerja pada skrip bash? Bagaimana dengan skrip Python?
xeyes
.Jawaban:
Ketika Anda menutup jendela Terminal GNOME, SIGHUP dikirim ke shell yang sedang dijalankan. Shell biasanya akan mengirim SIGHUP ke setiap grup proses yang diketahuinya dibuat - bahkan yang dimulai dengan
nohup
- dan kemudian keluar. Jika shellbash
, itu akan melewatkan mengirim SIGHUP ke grup proses yang ditandai dengan penggunadisown
.Menjalankan perintah dengan
nohup
membuatnya mengabaikan SIGHUP, tetapi prosesnya dapat mengubahnya. Ketika disposisi SIGHUP untuk suatu proses adalah default, maka jika menerima SIGHUP, proses tersebut akan dihentikan.Linux menyediakan beberapa alat untuk memeriksa pengaturan sinyal proses yang sedang berjalan.
Skrip shell chromium-browser melakukan salah satu
exec
dari aplikasi yang dikompilasi, jadi ID prosesnya tetap sama. Jadi untuk melihat pengaturan sinyalnya, saya berlarinohup chromium-browser &
dan kemudian melihat/proc/$!/status
untuk melihat disposisi sinyal.Itu adalah angka hex. Ini menunjukkan bahwa SIGHUP tidak ditangkap dan tidak diabaikan. Hanya SIGPIPE (bit ke-13 di SigIgn) yang diabaikan. Saya melacak ini ke kode berikut :
Meskipun ada komentar, sinyal yang diabaikan oleh orang tua tidak diabaikan. SIGHUP akan membunuh kromium.
Solusinya adalah melakukan apa yang ditunjukkan @ xx4h: gunakan
disown
perintah di bash Anda sehingga, jika bash harus keluar, itu tidak mengirim SIGHUP kechromium-browser
grup proses. Anda dapat menulis fungsi untuk melakukan ini:sumber
trap "" 1
, itu akan membuat shell (dan anak-anaknya) mengabaikan SIGHUP. Saya akan mengklarifikasi ini.trap
perintah dalam shell script wrapper tidak mencegah hal ini, dan berjalannohup
tidak dapat mencegah hal ini. Saya akan merevisi jawaban saya untuk mencerminkan hal ini.Jika
chromium-browser
adalah sesuatu sepertigoogle-chrome
maka saya pikir yang paling masalah mungkin adalah bahwachromium-browser
tidakchromium
tetapi bukan shell-wrapper yang menginisialisasi state kemudianexec
schromium
.Dalam
google-chrome
instalasi saya , biner sebenarnya terletak di/opt/google/chrome
dan pembungkusnya/usr/bin
hanyalah skrip shell yang mengatur banyak lingkungan tentangxdg-*
default dan path absolut dan serupa sebelum mengganti dirinya dengan biner yang tepat.Pada titik ini setiap sinyal yang
nohup
awalnya mungkin diabaikan atas nama skrip yang disebutnya sebagai anaknya akan berhenti menjadi masalah dan kecuali skrip pembungkusnya dengan hati-hati mengaturnya jika tidak (yang tidak ada) ctty diwarisi.Cobalah
file /usr/bin/chromium-browser
untuk memeriksa apakah itu skrip shell yang saya pikir benar. Jika demikian, pertimbangkan untuk menulis ulang agar lebih sesuai dengan Anda.Saya dapat mengatakan bahwa melakukan saja
google-chrome 2>/dev/null &
membuatnya tetap terbuka untuk saya, tetapi saya tidak dapat mengingat apakah itu kemungkinan hasil modifikasi yang saya buat pada skrip - itu lebih dari setahun yang lalu.sumber
chromium-browser
sebelumnya juga terjadigoogle-chrome
sekarang. Saya belumchromium-browser
menginstal.nohup google-chrome 2>/dev/null &
tidak menyimpannya agar tidak ditutup ketika tab terminal ditutup.google-chrome
adalah skrip bash/opt/google/chrome/google-chrome
. Mengapa nohup diterapkan pada skrip bash tidak berfungsi? Bagaimana kami bisa membuatnya bekerja pada skrip bash? Bagaimana dengan skrip Python?chrome
biner yang sebenarnya .exec
padachrome
biner yang sebenarnya ? Bagaimana cara saya memodifikasi skrip? Inilah saya/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... Di bagian atas$HERE
diatur ke nilaireadlink $0
(yang merupakan jalur instalasi Anda untukgoogle-chrome
) tetapi/opt/google/chrome/chrome
merupakan biner - yang merupakan pengganti skrip itu sendiri.exec
mungkin. Anda akan berakhir dengan tambahan pid (di luar 1000 lainnya) dan proses shell menunggu, tapi saya pikir itu sejauh itu. Atau kalau tidak Anda bisa mengganti denganexec
/nohup
mungkin. Semuanya tergantung pada apa yangchrome
akan ditoleransi - tetapi harus bekerja seperti itu.Chromium tampaknya istimewa.
nohup chromium-browser & disown
harus bekerja dalam hal ini. Lihat juga: /programming/11421810/nohup-doesnt-work-with-chromiumsumber
nohup chromium-browser &
tidak bekerja