Pengurusan proses latar belakang bash

Pengurusan proses latar belakang bash

Terdapat banyak kali apabila pemaju atau pengguna bash ingin menjalankan proses di latar belakang, sama ada dari baris arahan atau dari dalam skrip bash, dan kemudian mengendalikan proses yang sama sekali lagi kemudian. Terdapat pelbagai alat baris arahan yang membolehkan seseorang melakukannya. Mampu memulakan, mengurus dan memusnahkan proses latar belakang adalah keperluan untuk banyak tugas peringkat yang lebih maju, terutamanya dalam bidang skrip lanjutan dan kawalan proses.

Dalam tutorial ini anda akan belajar:

  • Cara Memulakan, Mengendalikan dan/atau Mengurus, Dan Memusnahkan Proses Latar Belakang
  • Alat baris arahan apa yang tersedia untuk membantu anda dengan pengurusan proses bash
  • Contoh yang menonjolkan penggunaan proses latar belakang di baris perintah bash
Pengurusan proses latar belakang bash

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain Sebarang utiliti yang tidak termasuk dalam shell bash secara lalai boleh dipasang menggunakan sudo apt-get memasang nama utiliti (atau pemasangan yum untuk sistem berasaskan redhat)
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Contoh 1: Memulakan proses di latar belakang dan membawanya kembali ke latar depan

$ tidur 1000 & [1] 25867 $ fg tidur 1000 


Di sini kami memulakan proses tidur 1000 saat di latar belakang. Sekiranya kita mahu meletakkan proses di latar belakang, kita boleh menggunakan ampersand (&) menandatangani sebarang arahan. Ini akan meletakkan proses di latar belakang, dan melaporkan kembali Pid (ID Proses, nombor pengecam yang mengenal pasti sebarang proses yang berjalan pada mesin Linux). Dalam contoh ini, Pid adalah 25867. Perhatikan bahawa proses terus berjalan apabila ia diletakkan di latar belakang, yang memberikan kita yang terbaik dari kedua -dua dunia; Proses ini sedang dilaksanakan, dan kami mendapatkan baris arahan kami dalam masa yang sama! Hebat.

Kami seterusnya meletakkan proses kembali di latar depan (seolah -olah tidak pernah ada arahan latar belakang) dengan menggunakan FG (i.e. foreground) perintah. Hasilnya ialah kita melihat proses apa yang diletakkan di latar depan lagi (i.e. Tidur 1000) dan command prompt kami tidak kembali ketika kami meletakkan tidur kembali di latar depan dan command prompt hanya akan kembali apabila tidur 1000 saat selesai.

Katakan bahawa kami meletakkan Tidur 1000 di latar belakang, melakukan kerja lain selama 500 saat, dan kemudian dilaksanakan FG... berapa lama tidur masih berjalan? Sekiranya anda meneka (atau tahu) 500 saat, maka anda betul. 500 saat pertama dibelanjakan sebagai proses latar belakang, dan 500 kedua akan menjadi proses latar depan.

Perhatikan juga bahawa jika anda menamatkan shell arahan anda akan ditamatkan - sama ada ia berjalan di latar belakang, atau di latar depan (kecuali jika anda menolaknya, lebih lanjut mengenai ini dalam contoh seterusnya).

Contoh 2: Menolak proses

$ tidur 1000 & [1] 26090 $ disown %1 $ 

Di sini kami memulakan satu lagi tidur 1000 saat, dan kami dimaklumkan mengenai proses latar belakang seperti sebelumnya. Seterusnya kami dilaksanakan tolak %1, merujuk kepada proses latar belakang pertama (seperti yang ditunjukkan oleh [1] sebelum PID!), dan mengarahkan bash untuk menyangkal (memisahkan) proses ini dari cangkang semasa. Bukannya ia akan dipisahkan dari pengguna semasa (dan contohnya ps -ef | GREP Tidur | grep -v grep memang masih akan menunjukkan userid anda), tetapi dari sesi shell semasa. Melihat:

$ tidur 1000 & [1] 26214 $ disown %1 $ ps -ef | GREP Tidur | grep -v grep roel 26214 26120 0 13:13 pts/3 00:00:00 tidur 1000 $ keluar 

Kemudian, membuka shell baru dan melaksanakan semula ps Kita dapat melihat bahawa perintah itu masih ada dan kini dilampirkan ke PPID (PID induk) 1 bukan 26120 Sebagai ibu bapa PID:

$ ps -ef | GREP Tidur | grep -v grep roel 26214 1 0 19:48 ? 00:00:00 Tidur 1000 

Seolah -olah cangkang masih berjalan (perhatikan 26214 PID masih aktif/dikaitkan dengan berjalan tidur), namun bahagian perintah aktifnya hilang!

Hebat, jadi ini memberi kita cara untuk memisahkan proses dari shell semasa, dan dengan itu memastikan mereka terus berjalan ketika sesi shell kami ditutup.

Contoh 3: Meletakkan arahan ke latar belakang

$ tidur 1000 ^z [1]+ berhenti tidur 1000 $ bg %1 [1]+ tidur 1000 & $ 

Di sini kami memulakan a Tidur 1000 di latar depan (tidak & digunakan), dan proses itu terganggu dengan pintasan papan kekunci Ctrl+z. Perhatikan bahawa walaupun output mengatakan ^Z (dan ^ adalah simbol untuk menunjukkan Ctrl), The Z sebenarnya huruf kecil z, Oleh itu, anda tidak perlu menggunakan Shift, Hanya Ctrl+z.

Perhatikan bahawa proses itu sebenarnya berhenti, ia tidak terus berjalan. Sekarang kita telah meletakkan proses di latar belakang, dan berhenti sejenak. Untuk membiarkan proses ini terus berjalan sekarang, kami mempunyai dua pilihan; FG %1 - i.e. Letakkan proses yang ditunjukkan oleh [1] kembali ke latar depan dan terus berjalan secara normal, atau BG %1 yang akan meneruskan prosesnya, tetapi di latar belakang. Contohnya kita dapat melihat yang terakhir, dan arahan kami kembali seperti yang diharapkan.

Perhatikan bahawa perkara di atas boleh sedikit ditambah dengan menyangkal, Memadankan cara yang sering digunakan untuk mengendalikan proses semasa menggunakan pelayan jauh. Katakan anda disambungkan melalui SSH ke pelayan jauh dan memulakan pekerjaan yang besar, contohnya sandaran atau laporan generasi. Sekarang anda ingin meninggalkan pejabat anda untuk hari itu, tetapi tidak pasti sama ada sambungan SSH anda akan terus hidup sepanjang malam, dan sama ada komputer anda tidak akan hibernate atau serupa. Mana -mana tindakan ini boleh menjejaskan pekerjaan yang sedang berjalan!

Dalam kes itu, anda boleh melakukan perkara berikut;

$ tidur 1000 ^z [1]+ berhenti tidur 1000 $ bg %1 [1]+ tidur 1000 & $ disown %1 $ 


Dan dengan senang hati dan selamat berjalan dari komputer anda (setelah menguncinya;), kerana anda dapat yakin bahawa - walaupun sambungan SSH anda gagal, atau komputer anda hibernat, atau wanita pembersih mengetuk kord kuasa - pekerjaan anda akan tetap Berlari. Memandangkan proses itu ditolak/dipisahkan dari sesi shell semasa, ia akan terus berjalan walaupun sesi shell semasa ditamatkan.

Satu kaveat kecil ialah anda tidak boleh menggunakan FG Pada waktu pagi untuk membawa kerja kembali ke latar depan, walaupun sambungan SSH dan shell anda tidak pernah ditamatkan/gagal:

$ fg bash: fg: semasa: tidak ada pekerjaan sedemikian $ fg %1 bash: fg: %1: no pekerjaan sedemikian 

Apabila ia ditolak, ia tidak disisihkan dan hilang! Pekerjaan itu masih akan berjalan di latar belakang walaupun, dan anda juga boleh membunuhnya menggunakannya PID (seperti yang dapat diperhatikan dari ps -ef | grep your_process_name | grep -v grep.

Contoh 4: Proses latar belakang berganda dan proses menamatkan

Mula -mula kita memulakan dua proses di latar belakang menggunakan yang dipercayai Tidur 1000 Contoh:

$ tidur 1000 & [1] 27158 $ tidur 1000 & [2] 27159 

Kita dapat melihat di sini bahawa dua proses latar belakang ([1] dan [2], dengan PID 27158 dan 27159 masing -masing) dimulakan. Seterusnya, kami membunuh proses pertama:

$ bunuh %1 $ [1]- Tidur yang ditamatkan 1000 $ 

Itu mudah/mudah, betul? Satu soalan yang boleh ditanya adalah mengapa maklumat yang ditamatkan tidak ditunjukkan dengan segera (akhbar tambahan tambahan diperlukan seperti yang anda dapat lihat) dan sebabnya proses itu tidak ditamatkan sebelum baris arahan dikembalikan. Sebagai sebahagian daripada kerja yang dilakukan setiap kali sebelum baris arahan baru ditunjukkan adalah melaporkan beberapa status, termasuk status proses latar belakang jika diperlukan. Oleh itu, apabila Enter ditekan lagi (ditunjukkan oleh kosong $ garis, laporan proses yang ditamatkan ditunjukkan.

Contoh 5: Satu yang dilakukan sebelum yang lain

Mari kita mulakan dua proses, tetapi kali ini proses kedua hanya akan tidur selama 3 saat:

$ tidur 1000 & [1] 27406 $ tidur 3 & [2] 27407 $ 

Selepas kira -kira 5 saat, menekan Enter, kita akan melihat:

$ [2]+ selesai tidur 3 

Apa yang akan berlaku sekarang jika kita menggunakan FG dalam kes ini tanpa asal [1] penentu?

$ fg tidur 1000 ^z [1]+ berhenti tidur 1000 $ 


Proses pertama akan berterusan! Ini juga berlaku jika prosedur terbalik digunakan:

$ tidur 10 & [1] 27346 $ tidur 1000 & [2] 27347 $ [1]- tidur tidur 10 $ fg tidur 1000 ^z [2]+ berhenti tidur 1000 

The FG Perintah akan selalu mengambil arahan terakhir yang diletakkan di latar belakang (dan yang belum selesai), dan masukkannya ke latar depan lagi.

Kesimpulan

Dalam artikel ini, kami melihat pelbagai arahan, termasuk BG, FG dan latar belakang bash idiom ampersand & yang boleh diletakkan selepas arahan mana -mana untuk meletakkan perintah itu ke latar belakang. Kami juga meneroka pengguna bunuh perintah dan melihat bagaimana menangani pelbagai proses latar belakang menggunakan % Idiom bash dengan nombor proses latar belakang yang dipadankan seperti %1 untuk [1] dan lain-lain.

Sekiranya anda ingin mengetahui lebih lanjut mengenai Bash secara umum, lihatlah siri Tips dan Contoh Talian Perintah Bash berguna.

Nikmati kemahiran bash baru anda yang dijumpai, dan jika anda melakukan sesuatu yang sejuk dengan proses latar belakang, sila tinggalkan komen kami di bawah!

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Menguasai Gelung Skrip Bash
  • Gelung bersarang dalam skrip bash
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Pengurusan skrip & proses bash berbilang threaded di…
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Mengendalikan input pengguna dalam skrip bash
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Tutorial Debugging GDB untuk Pemula
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux