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.