Apa perbedaan antara nohup dan ampersand

243

Keduanya nohup myprocess.out &atau myprocess.out &atur myprocess.out untuk berjalan di latar belakang. Setelah saya mematikan terminal, prosesnya masih berjalan. Apa perbedaan di antara mereka?

Yarkee
sumber
shell apa yang kamu gunakan? perilakunya bervariasi di seluruh cangkang
shx2
1
pesta. Dan saya tahu mengapa sekarang menurut jawaban @nemo.
Yarkee
@Yarkee jika jawaban sesuai dengan masalah Anda, harap tandai pertanyaan sebagai diterima (centang di bawah suara jawaban) sehingga tidak menggantung di sekitar sebagai tidak dijawab. Anda harus melakukannya untuk semua pertanyaan Anda :)
nemo
1
shutdownharus dihindari sebagai istilah dengan makna Linux tertentu., dan digantikan oleh exit.
Patrizio Bertoni

Jawaban:

317

nohupmenangkap sinyal hangup (lihat man 7 signal) sementara ampersand tidak (kecuali shell dikonfigurasi dengan cara itu atau tidak mengirim SIGHUPsama sekali).

Biasanya, ketika menjalankan perintah menggunakan &dan keluar dari shell setelahnya, shell akan mengakhiri sub-perintah dengan sinyal hangup ( kill -SIGHUP <pid>). Ini dapat dicegah menggunakan nohup, karena menangkap sinyal dan mengabaikannya sehingga tidak pernah mencapai aplikasi yang sebenarnya.

Jika Anda menggunakan bash, Anda dapat menggunakan perintah shopt | grep huponuntuk mencari tahu apakah shell Anda mengirimkan SIGHUP ke proses anaknya atau tidak. Jika tidak aktif, proses tidak akan dihentikan, karena tampaknya ini berlaku untuk Anda. Informasi lebih lanjut tentang bagaimana bash mengakhiri aplikasi dapat ditemukan di sini .

Ada kasus di mana nohuptidak bekerja, misalnya ketika proses Anda mulai menghubungkan kembali SIGHUPsinyal, seperti halnya di sini .

nemo
sumber
Mungkin perlu dicatat bahwa hanya &menyebabkan sub perintah tidak menerima beberapa sinyal (misalnya SIGINT). nohuppada dasarnya menambah SIGHUPdaftar sinyal yang tidak disebarkan.
studgeek
46

myprocess.out &akan menjalankan proses di latar belakang menggunakan subkulit. Jika shell saat ini dihentikan (misalnya dengan logout), semua subkulit juga dihentikan sehingga proses latar belakang juga akan dihentikan. The nohup perintah mengabaikan HUPsinyal dan dengan demikian bahkan jika shell saat dihentikan, subkulit dan myprocess.outakan terus berjalan di latar belakang. Perbedaan lainnya adalah itu &saja tidak mengarahkan ulang stdout / stderr jadi jika ada output atau kesalahan, itu ditampilkan pada terminal. nohup di sisi lain mengarahkan stdout / stderr ke nohup.outatau $HOME/nohup.out.

amit_g
sumber
6
Saya menjalankan myprocess.out &dan keluar dari shell. Namun, ketika saya gunakan ps aux | grep myprocess.outdi shell lain, saya masih dapat menemukan "myprocess.out". Artinya daripada prosesnya masih berjalan, tidak dihentikan.
Yarkee
1
@amit_g Ketika membunuh shell induk dengan kill -9tidak akan ada SIGHUP karena ini akan membutuhkan shell induk untuk menangani SIGKILL, yang tidak bisa.
nemo
2
Periksa shopt | grep hupon sebagaimana disebutkan dalam jawaban lain.
amit_g
31

Sebagian besar waktu kita masuk ke server jauh menggunakan ssh. Jika Anda memulai skrip shell dan Anda logout maka proses tersebut terhenti. Nohup membantu untuk terus menjalankan skrip di latar belakang bahkan setelah Anda keluar dari shell.

Nohup command name &
eg: nohup sh script.sh &

Nohup menangkap sinyal HUP. Nohup tidak menempatkan pekerjaan secara otomatis di latar belakang. Kita perlu mengatakan bahwa secara eksplisit menggunakan &

Missgeorge
sumber
Terima kasih. Tidak mengharapkan jawaban Anda tetapi fakta bahwa itu ada di sini hebat. Itu menjawab pertanyaan yang tidak saya tanyakan: D
Vaibhav Kaushal
26

Menggunakan ampersand (&) akan menjalankan perintah dalam proses anak (anak ke sesi bash saat ini). Namun, ketika Anda keluar dari sesi, semua proses anak akan terbunuh.

menggunakan nohup + ampersand (&) akan melakukan hal yang sama, kecuali bahwa ketika sesi berakhir, induk dari proses anak akan diubah menjadi "1" yang merupakan proses "init", sehingga menjaga anak dari terbunuh.

Michel
sumber
7

Koreksi saya jika saya salah

  nohup myprocess.out &

nohup menangkap sinyal hangup, yang berarti akan mengirimkan proses ketika terminal ditutup.

 myprocess.out &

Proses dapat berjalan tetapi akan berhenti begitu terminal ditutup.

nohup myprocess.out

Proses dapat menjalankan bahkan terminal tertutup, tetapi Anda dapat menghentikan proses dengan menekan terminal ctrl+ zin. Crt+ ztidak berfungsi jika &ada.

John Joe
sumber
2

Perintah nohup adalah utilitas pelindung sinyal dan menangkap sinyal hangup. Dimana ampersand tidak menangkap sinyal hang up. Shell akan mengakhiri sub perintah dengan sinyal hang up ketika menjalankan perintah menggunakan & dan keluar shell. Ini dapat dicegah dengan menggunakan nohup, karena menangkap sinyal. Perintah Nohup menerima sinyal hang yang dapat dikirim ke sebuah proses oleh kernel dan memblokirnya. Perintah Nohup sangat membantu ketika pengguna ingin memulai aplikasi yang lama berjalan keluar atau menutup jendela di mana proses dimulai. Salah satu dari tindakan ini biasanya meminta kernel untuk menutup aplikasi, tetapi pembungkus nohup akan memungkinkan proses untuk melanjutkan. Menggunakan ampersand akan menjalankan perintah dalam proses anak dan anak ini dari sesi bash saat ini. Saat Anda keluar dari sesi, semua proses anak dari proses itu akan dibunuh. Ampersand terkait dengan kontrol pekerjaan untuk shell yang aktif. Ini berguna untuk menjalankan proses dalam sesi di latar belakang.

santosh
sumber
0

Ada banyak kasus ketika perbedaan kecil antara lingkungan dapat menggigit Anda. Ini adalah salah satu yang saya jalankan baru-baru ini. Apa perbedaan antara kedua perintah ini?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

Jawabannya sama seperti biasa - tergantung.

nohup menangkap sinyal hangup sedangkan ampersand tidak.

Apa sinyal hangup?

SIGHUP - hangup terdeteksi pada terminal kontrol atau matinya proses kontrol (nilai: 1).

Biasanya, ketika menjalankan perintah menggunakan & dan keluar dari shell sesudahnya, shell akan mengakhiri sub-perintah dengan sinyal hangup (seperti kill -SIGHUP $ PID). Ini dapat dicegah menggunakan nohup, karena menangkap sinyal dan mengabaikannya sehingga tidak pernah mencapai aplikasi yang sebenarnya.

Baik, tetapi seperti dalam kasus ini selalu ada 'tetapi'. Tidak ada perbedaan antara metode peluncuran ini ketika shell dikonfigurasikan dengan cara di mana shell tidak mengirim SIGHUP sama sekali.

Jika Anda menggunakan bash, Anda dapat menggunakan perintah yang ditentukan di bawah ini untuk mengetahui apakah shell Anda mengirimkan SIGHUP ke proses turunannya atau tidak:

~ $ shopt | grep hupon

Dan terlebih lagi - ada kasus di mana nohup tidak bekerja. Misalnya, ketika proses Anda mulai menghubungkan kembali sinyal NOHUP (dilakukan di dalam, pada level kode aplikasi).

Dalam kasus yang dijelaskan, kurangnya perbedaan menggigit saya ketika di dalam skrip peluncuran layanan kustom ada panggilan ke skrip kedua yang mengatur dan meluncurkan aplikasi yang tepat tanpa perintah nohup.

Di satu lingkungan Linux semuanya berjalan lancar, di aplikasi kedua berhenti begitu skrip kedua keluar (mendeteksi kasus itu, tentu saja membuat saya lebih banyak waktu daripada yang mungkin Anda pikirkan: stuck_out_tongue :).

Setelah menambahkan nohup sebagai metode peluncuran ke skrip kedua, aplikasi tetap berjalan meskipun skrip akan keluar dan perilaku ini menjadi konsisten pada kedua lingkungan.

Devender Goyal
sumber