Kapan Anda perlu 'nohup' jika Anda sudah forking menggunakan '&'?

26

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'?

Cedric Martin
sumber
1
Sudahkah Anda membaca jawaban yang diterima dan utas komentarnya? Mereka menjelaskan apa yang nohupdilakukannya. Bagian mana yang membuat Anda bingung?
Gilles 'SO- stop being evil'
3
@Gilles: mungkin jelas bagi Anda , karena Anda terbiasa dengan hal-hal ini (melihat perwakilan Anda) ... Namun, untuk awalnya, jawaban yang diterima di tautan yang saya masukkan tidak mengatakan sepatah kata pun tentang penggunaan baik nohup dan '&' ... Saya cukup yakin pertanyaan saya cukup jelas dan cukup berbeda dari yang lain, dan dua jawaban hebat di sini tampaknya membuktikan bahwa; ) Juga, apakah Anda benar-benar menyiratkan bahwa saya mengambil rasa sakit untuk menghubungkan ke pertanyaan lain, tetapi tanpa membaca jawaban yang diterima !?
Cedric Martin

Jawaban:

32

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 cdfungsi shell dan biasanya tidak akan melakukan proses baru. type cmdbiasanya akan memberi tahu Anda apakah cmditu perintah eksternal atau fungsi shell. type typememberitahu Anda bahwa typeitu sendiri adalah fungsi shell.

nohupadalah sesuatu yang berbeda. Ini memberitahu proses baru untuk diabaikan SIGHUP. Ini adalah sinyal yang dikirim oleh kernel ketika shell induk ditutup.

Untuk menjawab pertanyaan Anda lakukan hal berikut:

  1. run emacs & (secara default seharusnya dijalankan di jendela X terpisah) .
  2. pada shell induk, jalankan exit.

Anda akan melihat bahwa emacsjendela terbunuh, meskipun berjalan di latar belakang. Ini adalah perilaku default dan nohupdigunakan tepat untuk memodifikasi itu.

Menjalankan pekerjaan di latar belakang (dengan &atau bg, 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 ke stdin/ stdout).

Bagaimanapun, ini tidak mempengaruhi cara anak bereaksi SIGHUP. nohuptidak.

rahmu
sumber
Memberi +1 kepada Anda berdua untuk jawaban yang bagus ... Tapi saya masih bingung ... Saya sudah mencoba itu sebelum menjawab pertanyaan saya: mungkin pengaturan Debian Linux saya (sangat lama) tidak dikonfigurasi dengan benar tetapi jika saya "emacs & "dan kemudian ketik" keluar ", hanya xterm saya yang keluar: emacs tetap di sana.
Cedric Martin
Emacs cukup rumit sehingga dapat menangani SIGHUP sendiri. Hanya secara default yang memproses keluar pada SIGHUP. Banyak program 'daemon' seperti ntpd atau inetd akan membaca kembali konfigurasinya pada SIGHUP alih-alih keluar. Saya seorang pria vim sendiri, jadi saya tidak punya banyak pengalaman dengan emacs.
Bruce Ediger
3
Tidak ada yang istimewa tentang emacs. Sebuah shell biasanya mengirim SIGHUPke anaknya proses ketika shell itu sendiri menerima SIGHUP, bukan ketika shell keluar secara normal. bash memiliki opsi huponexityang menyebabkannya mengirim SIGHUPke anak-anak ketika keluar, tetapi itu tidak diaktifkan secara default. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson
Halo. pertama-tama, penjelasan yang bagus. Saya mencoba memverifikasi tesis Anda dengan menjalankan proses dengan &dan menutup shell saya dengan menjalankan exit. Prosesnya masih berjalan. Ada ide mengapa itu belum terbunuh? Atau saya melewatkan sesuatu di sini?
Ali Yılmaz
Apa proses yang Anda jalankan?
rahmu
16

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 ... &, nohupperintah menetapkan SIGHUP untuk diabaikan, dan kemudian jalankan perintah. Perintah yang baru dijalankan itu menjaga penutup sinyal yang disetel nohup, 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 nohupperintah pada memungkinkannya untuk tetap berjalan setelah Anda menutup xterm, atau Anda logout.

Bruce Ediger
sumber
Maaf - Anda kehilangan saya. Apakah Anda mengatakan bahwa menggunakan &dengan nohupmembuat perintah tetap berjalan dalam kasus tertentu di mana hanya menggunakan nohuptidak akan? Itu tampaknya bertentangan dengan jawabannya di sini: unix.stackexchange.com/a/288064/1822
Mike B
2
@ MikeB - "&" melakukan panggilan sistem fork / set hal / exec yang biasa untuk menempatkan perintah "di latar belakang". Yaitu, perintah yang tidak diaktifkan berjalan secara tidak sinkron. Melakukan nohupbeberapa hal sebelum exec()panggilan sistem untuk membuat proses bercabang mengabaikan sinyal tertentu. Jadi, ya, "&" akan memungkinkan perintah dijalankan dalam keadaan tertentu yang nohuptidak akan dilakukan oleh orang tua biasa . Seperti menutup xterm yang terkait dengan shell yang melakukan nohup, atau log off.
Bruce Ediger
-1

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:

  ping google.com > ping_result  &

Setelah login kembali periksa jumlah baris dalam file output ping_resultyang akan terus bertambah berarti masih berjalan namun telah diberitahu bahwa itu akan ditutup. lalu apa gunanya nohupperintah.

Skenario lain ==> seperti yang dinyatakan di atas untuk nohup emac &-> yang harus tetap emacberjalan setelah keluar sistem tetapi tidak menunjukkan berjalan setelah masuk kembali.

aditya
sumber