Pengurusan skrip & proses bash berbilang threaded di baris arahan

Pengurusan skrip & proses bash berbilang threaded di baris arahan

Perkara yang boleh anda lakukan menggunakan skrip bash tidak terbatas. Sebaik sahaja anda mula membangunkan skrip lanjutan, anda akan mendapati anda akan mula menjalankan had sistem operasi. Sebagai contoh, adakah komputer anda mempunyai 2 benang CPU atau lebih (banyak mesin moden mempunyai 8-32 benang)? Jika ya, maka anda mungkin akan mendapat manfaat daripada skrip dan pengekodan bash berbilang threaded. Teruskan membaca dan cari tahu mengapa!

Dalam tutorial ini anda akan belajar:

  • Cara Melaksanakan Bash Multi-threaded One-Liners terus dari baris arahan
  • Mengapa pengekodan pelbagai threaded hampir selalu dapat dan akan meningkatkan prestasi skrip anda
  • Bagaimana proses latar belakang dan latar depan berfungsi dan bagaimana memanipulasi beratur pekerjaan
Pengurusan Skrip Bash & Proses Multi-threaded

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran-bebas, versi bash bergantung
Perisian Antara muka baris perintah bash (bash)
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Apabila anda melaksanakan skrip bash, maksimum akan menggunakan benang CPU tunggal, melainkan jika anda memulakan subshells/threads. Jika mesin anda mempunyai sekurang-kurangnya dua benang CPU, anda akan dapat memaksimumkan sumber CPU menggunakan skrip pelbagai threaded di bash. Alasannya adalah mudah; Sebaik sahaja 'benang' sekunder (baca: subshell) dimulakan, maka benang berikutnya boleh (dan sering akan) menggunakan benang CPU yang berbeza.

Anggapkan seketika bahawa anda mempunyai mesin moden dengan 8 atau lebih utas. Bolehkah anda mula melihat bagaimana jika kita dapat melaksanakan kod - lapan benang selari pada masa yang sama, masing -masing berjalan pada benang CPU yang berbeza (atau dikongsi di semua benang) - dengan cara ini ia akan melaksanakan lebih cepat maka satu proses berjalan pada benang CPU tunggal (yang mungkin dikongsi bersama dengan proses berjalan lain)? Keuntungan yang direalisasikan akan bergantung sedikit pada apa yang sedang dilaksanakan, tetapi keuntungan akan ada, hampir selalu!

Teruja? Hebat. Mari kita menyelam ke dalamnya.

Mula-mula kita perlu memahami apa yang subshell, bagaimana ia bermula, mengapa anda akan menggunakannya, dan bagaimana ia dapat digunakan untuk melaksanakan kod bash multi-threaded.

Subshell adalah satu lagi proses klien bash yang dilaksanakan/bermula dari dalam yang sekarang. Mari buat sesuatu yang mudah, dan mulakan satu dari dalam terminal terminal bash yang dibuka:

$ bash $ exit exit $ 

Apa yang berlaku di sini? Mula -mula kami memulakan satu lagi shell bash (bash) yang bermula dan seterusnya menghasilkan arahan ($). Jadi yang kedua $ Dalam contoh di atas sebenarnya adalah shell bash yang berbeza, dengan yang berbeza Pid (Pid adalah pengenal proses; Pengenal nombor unik yang secara unik mengenal pasti setiap proses berjalan dalam sistem pengendalian). Akhirnya kami keluar dari subshell melalui keluar dan kembali ke subshell induk! Bolehkah kita membuktikan ini sebenarnya yang berlaku? Ya:

$ echo $ 220250 $ bash $ echo $ 222629 $ exit exit $ echo $ 220250 $ 

Terdapat pemboleh ubah khas di bash $$, yang mengandungi Pid shell semasa yang digunakan. Bolehkah anda melihat bagaimana pengenal proses berubah setelah kami berada di dalam subshell?

Hebat! Sekarang kita tahu apa yang subshells, dan sedikit tentang bagaimana mereka bekerja, mari kita menyelam ke dalam beberapa contoh pengekodan pelbagai dan pelajari lebih lanjut!

Multi-threading mudah di Bash

Marilah kita mulakan dengan contoh multi-thread yang mudah satu-liner, yang mana output mungkin kelihatan agak mengelirukan pada mulanya:

$ untuk i dalam $ (seq 1 2); lakukan echo $ i; dilakukan 1 2 $ untuk i dalam $ (seq 1 2); Adakah Echo $ i & Selesai [1] 223561 1 [2] 223562 $ 2 [1]- Dilakukan echo $ i [2]+ dilakukan echo $ i $ 

Yang pertama untuk Loop (lihat artikel kami di gelung bash untuk belajar bagaimana untuk kod gelung
), kita hanya mengeluarkan pembolehubah $ i yang akan berkisar antara 1 hingga 2 (kerana penggunaan perintah SEQ), yang - menarik - dimulakan dalam subshell!

CATATAN
Anda boleh menggunakan $ (...) sintaks di mana sahaja Dalam baris arahan untuk memulakan subshell: Ini adalah cara yang sangat kuat dan serba boleh untuk kod subshells terus ke baris arahan lain!

Pada yang kedua untuk gelung, kami hanya mengubah satu watak. Daripada menggunakan ; - EOL (akhir garis) idiom sintaks bash yang menamatkan perintah yang diberikan (anda mungkin memikirkannya seperti Enter/Execute/Teruskan), kami menggunakan &. Perubahan mudah ini menjadikan program yang hampir sama sekali berbeza, dan kod kami kini pelbagai! Kedua -dua Echo akan diproses lebih kurang pada masa yang sama, dengan kelewatan kecil dalam sistem operasi masih perlu melaksanakan larian gelung kedua (ke echo '2').

Anda boleh memikirkan & dengan cara yang sama untuk ; dengan perbezaan itu & akan memberitahu sistem operasi untuk 'terus menjalankan arahan seterusnya, terus memproses kod' sedangkan ; akan menunggu arahan pelaksanaan semasa (ditamatkan oleh ;) untuk menamatkan / selesai sebelum kembali ke arahan arahan / sebelum terus memproses dan melaksanakan kod seterusnya.

Mari kita periksa output. Kita lihat:

[1] 223561 1 [2] 223562 $ 2 

Pada mulanya, diikuti oleh:

[1]- Selesai echo $ i [2]+ selesai echo $ i $ 

Dan terdapat juga garis kosong di antara, yang merupakan hasil proses latar belakang yang masih berjalan sementara menunggu input arahan seterusnya (cuba arahan ini beberapa kali di baris arahan, serta beberapa variasi cahaya, dan anda akan mendapat rasakan bagaimana ini berfungsi).

Output pertama ([1] 223561) menunjukkan kepada kita bahawa proses latar belakang telah dimulakan, dengan PID 223561 dan nombor pengenalpastian 1 diberikan kepadanya. Kemudian, sudah sebelum skrip mencapai echo kedua (echo mungkin menjadi pernyataan kod mahal untuk dijalankan), output 1 telah ditunjukkan.

Proses latar belakang kami tidak selesai sepenuhnya kerana output seterusnya menunjukkan kami memulakan subshell/thread kedua (seperti yang ditunjukkan oleh [2]) dengan PID 223562. Selanjutnya proses kedua mengeluarkan 2 ("Memaparkan": mekanisme OS boleh menjejaskan ini) sebelum benang kedua memuktamadkan.

Akhirnya, di blok kedua output, kita melihat kedua -dua proses menamatkan (seperti yang ditunjukkan oleh Selesai), serta apa yang mereka lakukan yang terakhir (seperti yang ditunjukkan oleh echo $ i). Perhatikan bahawa nombor yang sama 1 dan 2 digunakan untuk menunjukkan proses latar belakang.

Lebih banyak Multi-threading di Bash

Seterusnya, mari kita laksanakan tiga arahan tidur, semuanya ditamatkan oleh & (jadi mereka bermula sebagai proses latar belakang), dan marilah kita mengubah tempoh masa tidur mereka, jadi kita dapat lebih jelas melihat bagaimana pemprosesan latar belakang berfungsi.

$ tidur 10 & tidur 1 & tidur 5 & [1] 7129 [2] 7130 [3] 7131 $ [2]- Selesai tidur 1 $ [3]+ tidur tidur 5 $ [1]+ tidur tidur 10 

Output dalam kes ini harus jelas. Baris arahan segera kembali selepas kami Tidur 10 & Tidur 1 & Tidur 5 & perintah, dan 3 proses latar belakang, dengan PID masing -masing ditunjukkan. Saya memukul masuk beberapa kali di antara. Selepas 1 saat arahan pertama selesai menghasilkan Selesai untuk pengenal proses [2]. Selanjutnya proses ketiga dan pertama ditamatkan, mengikut tempoh tidur masing -masing. Perhatikan juga bahawa contoh ini menunjukkan dengan jelas bahawa pelbagai pekerjaan berjalan dengan berkesan, secara serentak, di latar belakang.

Anda mungkin juga mengambil + Log masuk contoh output di atas. Ini semua mengenai kawalan pekerjaan. Kami akan melihat kawalan pekerjaan dalam contoh seterusnya, tetapi buat masa ini penting untuk memahami perkara itu + menunjukkan adalah pekerjaan yang akan dikawal jika kita menggunakan/melaksanakan arahan kawalan pekerjaan. Selalunya pekerjaan yang telah ditambahkan ke dalam senarai pekerjaan yang paling baru -baru ini. Ini adalah pekerjaan lalai, yang selalu ditambah yang paling baru -baru ini ditambah ke dalam senarai pekerjaan.

A - menunjukkan pekerjaan yang akan menjadi lalai seterusnya untuk arahan kawalan kerja jika pekerjaan semasa (pekerjaan dengan + tanda) akan ditamatkan. Kawalan pekerjaan (atau dengan kata lain; pengendalian benang latar belakang) mungkin terdengar sedikit menakutkan pada mulanya, tetapi sebenarnya sangat berguna dan mudah digunakan setelah anda membiasakannya. Mari menyelam masuk!

Kawalan Pekerjaan di Bash

$ tidur 10 & tidur 5 & [1] 7468 [2] 7469 $ Pekerja 

Di sini kami meletakkan dua tidur di latar belakang. Sebaik sahaja mereka dimulakan, kami mengkaji pekerjaan yang sedang berjalan dengan menggunakan pekerjaan perintah. Seterusnya, benang kedua diletakkan di latar depan dengan menggunakan FG arahan diikuti dengan nombor pekerjaan. Anda boleh memikirkannya seperti ini; The & di dalam Tidur 5 Perintah telah berubah menjadi a ;. Dengan kata lain, proses latar belakang (tidak menunggu) menjadi proses latar depan.

Kami kemudian menunggu Tidur 5 perintah untuk memuktamadkan dan seterusnya meletakkan Tidur 10 perintah ke latar depan. Perhatikan bahawa setiap kali kami melakukan ini, kami terpaksa menunggu proses latar depan untuk selesai sebelum kami menerima baris perintah kami kembali, yang tidak berlaku apabila hanya menggunakan proses latar belakang (kerana mereka secara literal 'berjalan di latar belakang').

Kawalan Pekerjaan di Bash: Gangguan Pekerjaan

$ tidur 10 ^z [1]+ berhenti tidur 10 $ bg 1 [1]+ tidur 10 & $ fg 1 tidur 10 $ 

Di sini kita tekan Ctrl+Z untuk mengganggu tidur lari 10 (yang berhenti seperti yang ditunjukkan oleh Berhenti). Kami kemudian meletakkan proses ke latar belakang dan akhirnya meletakkannya ke latar depan dan menunggu ia selesai.

Kawalan Pekerjaan di Bash: Gangguan Pekerjaan

$ tidur 100 ^z [1]+ berhenti tidur 100 $ bunuh %1 $ [1]+ tidur ditamatkan 100 

Setelah memulakan 100 saat tidur, Kami seterusnya mengganggu proses berjalan oleh Ctrl+Z, dan kemudian membunuh proses latar belakang yang pertama/berjalan dengan menggunakan bunuh perintah. Perhatikan bagaimana kita menggunakan %1 dalam kes ini, bukan hanya 1. Ini kerana kita kini bekerja dengan utiliti yang tidak diikat secara langsung dengan proses latar belakang, seperti FG dan BG adalah. Oleh itu, untuk menunjukkan untuk membunuh bahawa kita mahu mempengaruhi proses latar belakang pertama, kita menggunakan % diikuti dengan nombor proses latar belakang.

Kawalan Pekerjaan di Bash: Proses disuntik

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

Dalam contoh terakhir ini, kami sekali lagi menamatkan larian tidur, dan letakkan ke latar belakang. Akhirnya kita melaksanakan menyangkal Perintah yang boleh anda baca sebagai: memisahkan semua proses latar belakang (pekerjaan) dari cangkang semasa. Mereka akan terus berlari, tetapi tidak lagi 'dimiliki' oleh cangkang semasa. Walaupun anda menutup shell dan logout semasa anda, proses ini akan terus berjalan sehingga mereka secara semula jadi menamatkan.

Ini adalah cara yang sangat kuat untuk mengganggu proses, meletakkannya ke latar belakang, menyangkalnya dan kemudian logout dari mesin yang anda gunakan, dengan syarat anda tidak perlu berinteraksi dengan proses itu lagi. Sesuai untuk proses jangka panjang di atas SSH yang tidak dapat terganggu. Cukup Ctrl+Z Proses (yang sementara mengganggu), letakkannya ke latar belakang, tolak semua pekerjaan, dan logout! Pulang ke rumah dan selamat malam yang santai mengetahui pekerjaan anda akan terus berjalan!

Contoh baris arahan skrip scripting & proses pengurusan pelbagai

Kesimpulan

Dalam tutorial ini kita melihat bagaimana untuk melaksanakan satu-liners bash berbilang threaded secara langsung dari baris arahan, dan meneroka mengapa pengekodan berbilang threaded sering meningkatkan prestasi skrip anda. Kami juga mengkaji bagaimana proses latar belakang dan latar depan berfungsi, dan kami memanipulasi barisan pekerjaan. Akhirnya kami meneroka bagaimana untuk menghilangkan giliran pekerjaan kami dari proses semasa, memberikan kami kawalan tambahan ke atas proses yang sedang berjalan. Nikmati kemahiran baru anda, dan tinggalkan komen kami di bawah dengan pengalaman kawalan kerja anda!

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Menguasai Gelung Skrip Bash
  • Pengurusan proses latar belakang bash
  • Gelung bersarang dalam skrip bash
  • Ubuntu 20.04 Panduan
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
  • Contoh Petua dan Trik Perintah Bash Berguna - Bahagian 6
  • Tutorial Debugging GDB untuk Pemula