Cara Menggunakan Perintah nohup di Linux

Diterbitkan: 2022-06-25
Laptop Linux menampilkan prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Perintah Linux nohup memungkinkan proses penting terus berjalan bahkan ketika jendela terminal yang meluncurkannya ditutup. Kami menunjukkan kepada Anda bagaimana menggunakan perintah mulia ini di Linux hari ini.

HUP dan SIGHUP

Unix, nenek moyang Linux, diciptakan sebelum PC ditemukan. Komputer adalah peralatan yang besar dan mahal. Orang-orang berinteraksi dengan mereka melalui jalur serial baik secara lokal di dalam gedung yang sama atau dari jarak jauh melalui koneksi modem yang lambat. Awalnya, mereka mengetik instruksi mereka pada teleprinter yang secara bertahap digantikan oleh terminal bodoh.

Mereka disebut bodoh karena kekuatan pemrosesan ada di komputer yang Anda sambungkan, bukan terminal tempat Anda mengetik. Program-program itu berjalan di komputer—di mana pun itu berada—dan bukan di perangkat di meja Anda.

Jika terjadi sesuatu yang memutuskan koneksi antara terminal Anda dan komputer, komputer mendeteksi penurunan saluran dan mengirimkan HUP atau hang up ke program yang sedang Anda jalankan. Program berhenti eksekusi ketika mereka menerima sinyal.

Cara Membunuh Aplikasi Desktop atau Proses Latar Belakang di Linux
TERKAIT Cara Membunuh Aplikasi Desktop atau Proses Latar Belakang di Linux

Fungsionalitas itu hidup di Linux hari ini. Pada PC Anda, jendela terminal adalah emulasi dari terminal fisik. Jika Anda menjalankan proses yang diluncurkan dari jendela terminal itu dan Anda menutup jendela itu, sinyal SIGHUP dikirim ke program sehingga mereka diberitahu tentang HUP dan tahu bahwa mereka harus dihentikan.

Ada efek kaskade yang terjadi. Jika proses telah meluncurkan proses anak, SIGHUP juga diteruskan ke mereka sehingga mereka tahu bahwa mereka harus dihentikan.

Perintah nohup meluncurkan proses anak tetapi menolak untuk memberikan sinyal SIGHUP kepada mereka. Itu mungkin terdengar seperti masalah, tetapi sebenarnya itu adalah fungsi yang berguna.

Perintah nohup

Jika Anda ingin agar proses tetap berjalan meskipun jendela terminal tempat peluncurannya ditutup, Anda memerlukan cara untuk mencegat SIGHUP agar program tidak pernah menerimanya. (Sebenarnya, jendela terminal tidak meluncurkan proses, mereka diluncurkan oleh sesi shell di dalam jendela terminal.) Solusi sederhana dan elegan untuk masalah itu adalah menempatkan proses lain di antara sesi shell dan program, dan memilikinya program lapisan tengah tidak pernah melewatkan sinyal SIGHUP .

Itulah yang dilakukan nohup . Ini meluncurkan program untuk Anda sehingga mereka adalah proses anak dari nohup , bukan proses anak dari shell. Karena mereka bukan proses anak dari shell, mereka tidak akan langsung menerima SIGHUP dari shell. Dan jika nohup tidak mewariskan SIGHUP kepada anak-anaknya, program tersebut tidak akan menerima SIGHUP sama sekali.

Ini berguna ketika, misalnya, Anda memiliki proses yang berjalan lama yang harus Anda biarkan berjalan sampai selesai. Jika Anda tidak sengaja menutup jendela terminal dan cangkangnya, Anda juga akan menghentikan prosesnya. Menggunakan nohup untuk meluncurkan proses mengisolasi proses dari sinyal nohup . Jika Anda bekerja dari jarak jauh di komputer melalui SSH dan Anda tidak ingin proses sensitif dihentikan jika koneksi jarak jauh gagal, Anda akan memulai proses di komputer jarak jauh dengan nohup .

Menggunakan nohup

Kami membuat program yang tidak melakukan sesuatu yang berguna, tetapi akan berjalan dan berjalan sampai dihentikan. Ini mencetak waktu ke jendela terminal setiap tiga detik. Ini disebut long-proc untuk "proses panjang."

 ./proc panjang 

Program proc panjang menjalankan jendela terminal

Jika ini adalah program yang melakukan sesuatu yang berguna dan kami ingin itu terus berjalan meskipun jendela terminal dan shell ditutup, kami akan meluncurkannya dengan nohup .

 nohup ./long-proc 

meluncurkan program proc panjang dari nohup

Proses dipisahkan dari stdin dan stdout sehingga tidak dapat menerima input apa pun atau menulis ke jendela terminal. Juga, karena masih berjalan, Anda tidak kembali ke prompt perintah. Semua yang dilakukan nohup adalah membuat proses tersebut kebal terhadap penutupan terminal. Itu tidak mengubah proses menjadi tugas latar belakang.

Apakah Anda sekarang harus me-reboot hanya untuk menghentikan proses? Tidak. Untuk menghentikan proses nohup yang belum Anda luncurkan sebagai proses latar belakang, tekan kombinasi tombol Ctrl+C.

Menghentikan proses long-proc dengan Ctrl+C

Output dari program telah ditangkap untuk kita dalam sebuah file bernama “nohup.out.” Kami dapat meninjaunya dengan lebih sedikit.

 lebih sedikit nohup.out 

Membuka file nohup.out dalam waktu yang lebih singkat

Apa pun yang biasanya akan dikirim ke jendela terminal ditangkap dalam file. nohup berikutnya akan ditambahkan ke file "nohup.out" yang ada.

Output dari long-proc yang ditulis ke file nohup.out, ditampilkan dalam waktu kurang

Cara yang lebih berguna untuk menjalankan proses adalah meluncurkannya dengan nohup sehingga tahan terhadap penutupan jendela terminal, dan menjadikannya tugas latar belakang pada saat yang bersamaan. Untuk melakukan ini, kami menambahkan ampersand “ & ” ke akhir baris perintah.

 nohup ./long-proc & 

meluncurkan program proc panjang dengan nohup dan menjadikannya tugas latar belakang

Anda harus menekan "Enter" sekali lagi untuk kembali ke command prompt. Kami diberi tahu bahwa nomor tugas dari proses tersebut adalah 1—angka dalam tanda kurung “ [] “— dan bahwa ID prosesnya adalah 13115.

Kita dapat menggunakan salah satu dari ini untuk menghentikan proses. "Ctrl+C" tidak akan berfungsi sekarang karena program tidak memiliki hubungan apa pun dengan jendela terminal atau shell.

Jika Anda lupa nomor pekerjaannya, Anda dapat menggunakan perintah jobs untuk membuat daftar tugas latar belakang yang telah diluncurkan dari jendela terminal tersebut.

 pekerjaan 

Mencantumkan tugas latar belakang yang telah diluncurkan dari jendela terminal

Untuk mematikan tugas kita, kita dapat menggunakan perintah kill dan nomor pekerjaan, didahului dengan tanda persentase “ % ”, seperti ini:

 bunuh %1

Jika Anda telah menutup jendela terminal, Anda harus menemukan ID proses dan menggunakannya dengan perintah kill . Perintah pgrep akan menemukan ID proses untuk proses yang cocok dengan petunjuk pencarian yang Anda berikan. Kami akan mencari nama proses.

 pgrep proses panjang 

Menemukan ID proses dari suatu proses berdasarkan nama

Sekarang kita dapat menggunakan ID proses untuk menghentikan proses.

 bunuh 13115 

Menggunakan perintah kill dan ID proses untuk menghentikan proses

Saat berikutnya Anda menekan "Enter", Anda akan diberitahu bahwa proses telah dihentikan.

Sekarang mari kita lihat apa yang tidak menghentikan proses. Kami akan meluncurkannya kembali, lalu menutup jendela terminal.

 nohup ./long-proc 

Menutup jendela terminal dengan proses yang sedang berjalan

Jika kita membuka jendela terminal baru dan mencari proses kita dengan pgrep , kita melihatnya masih berjalan. Menutup jendela terminal yang meluncurkan proses tidak berpengaruh.

 pgrep proses panjang 

Menggunakan pgrep untuk mencari proses berdasarkan nama

Dimungkinkan untuk meneruskan beberapa perintah ke nohup , tetapi biasanya lebih baik untuk meluncurkannya secara terpisah. Itu membuatnya lebih mudah untuk memanipulasi mereka sebagai pekerjaan latar belakang. Perintah tidak akan berjalan pada saat yang sama, mereka akan dieksekusi satu demi satu. Eksekusinya tidak bersamaan, itu berurutan. Untuk menjalankannya secara bersamaan, Anda harus meluncurkannya secara terpisah.

Karena itu, untuk meluncurkan beberapa proses sekaligus, gunakan nohup untuk meluncurkan shell Bash dan gunakan opsi -c (perintah) dengan string perintah. Gunakan tanda kutip tunggal “ ' ” untuk membungkus daftar perintah dan tanda kutip ganda “ && ” untuk memisahkan perintah.

 nohup bash -c 'ls /bin && ls /sbin' 

Meluncurkan dua proses dengan nohup

Jika Anda menggunakan less untuk melihat file “nohup.out”, Anda akan melihat output dari proses pertama, kemudian output dari proses kedua.

 lebih sedikit nohup.out 

Membuka file nohup.out dalam waktu yang lebih singkat

Output dari kedua perintah telah ditangkap dalam file "nohup.out". Itu tidak saling terkait, output dari proses kedua hanya dimulai setelah proses pertama dihentikan.

Isi file nohup.out dalam less

Jika Anda ingin menggunakan file Anda sendiri alih-alih "nohup.out", Anda dapat mengarahkan perintah ke file pilihan Anda.

 nohup bash -c 'ls /bin && ls /sbin' > myfile.txt 

mengarahkan output dari proses ke file yang disediakan pengguna

Perhatikan bahwa pesan tidak lagi mengatakan "menambahkan output ke nohupo.out", ia mengatakan "mengarahkan stderr ke stdout" dan kami mengarahkan stdout ke file "myfile.txt" kami.

Kita dapat melihat ke dalam file "myfile.txt" dengan lebih sedikit.

 kurangi myfile.txt 

Seperti sebelumnya, ini berisi output dari kedua perintah.


Sungguh lucu bagaimana sejarah utilitas kadang-kadang bisa membuatnya tampak seolah-olah tidak ada relevansinya dengan zaman modern. Perintah nohup adalah salah satunya. Sesuatu yang diciptakan untuk mengatasi pemutusan pada saluran serial masih berguna bagi pengguna Linux saat ini pada mesin yang sangat kuat.

TERKAIT: 37 Perintah Linux Penting yang Harus Anda Ketahui