Multi-Thread Bash Scripting & Proses Manajemen di baris perintah

Multi-Thread Bash Scripting & Proses Manajemen di baris perintah

Hal -hal yang dapat Anda lakukan menggunakan skrip bash tidak terbatas. Setelah Anda mulai mengembangkan skrip lanjutan, Anda akan segera menemukan Anda akan mulai mengalami batas sistem operasi. Misalnya, apakah komputer Anda memiliki 2 utas CPU atau lebih (banyak mesin modern memiliki 8-32 utas)? Jika demikian, maka Anda mungkin akan mendapat manfaat dari skrip dan pengkodean bash multi-threaded. Lanjutkan membaca dan cari tahu mengapa!

Dalam tutorial ini Anda akan belajar:

  • Cara mengimplementasikan multi-threaded bash one-liner langsung dari baris perintah
  • Mengapa pengkodean multi-threaded hampir selalu dapat dan akan meningkatkan kinerja skrip Anda
  • Bagaimana proses latar belakang dan latar depan bekerja dan cara memanipulasi antrian pekerjaan
Manajemen Scripting & Proses Multi-Threaded Bash

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi-independen, bergantung pada versi bash
Perangkat lunak Bash Command Line Interface (pesta)
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Saat Anda menjalankan skrip bash, itu secara maksimal akan menggunakan utas CPU tunggal, kecuali jika Anda memulai subshells/threads. Jika mesin Anda memiliki setidaknya dua utas CPU, Anda akan dapat memaksimalkan sumber daya CPU menggunakan scripting multi-threaded di bash. Alasan untuk ini sederhana; Segera setelah 'utas' sekunder (baca: subshell) dimulai, maka utas berikutnya dapat (dan sering akan) menggunakan utas CPU yang berbeda.

Asumsikan sejenak bahwa Anda memiliki mesin modern dengan 8 atau lebih utas. Dapatkah Anda mulai melihat bagaimana jika kami dapat menjalankan kode - delapan utas paralel semuanya pada saat yang sama, masing -masing berjalan pada utas CPU yang berbeda (atau dibagikan di semua utas) - dengan cara ini akan mengeksekusi lebih cepat daripada satu utas tunggal Proses berjalan pada utas CPU tunggal (yang dapat dibagikan bersama dengan proses berjalan lainnya)? Keuntungan yang disadari akan sedikit tergantung pada apa yang dieksekusi, tetapi keuntungan akan ada, hampir selalu!

Bersemangat? Besar. Mari selami.

Pertama-tama kita perlu memahami apa subskil itu, bagaimana ini dimulai, mengapa Anda menggunakannya, dan bagaimana itu dapat digunakan untuk menerapkan kode bash multi-threaded.

Subshell adalah proses klien bash lainnya yang dieksekusi/dimulai dari dalam yang saat ini. Mari kita lakukan sesuatu yang mudah, dan mulai dari dalam prompt terminal bash terbuka:

$ Bash $ EXIT EXIT $ 

Apa yang terjadi disini? Pertama kami memulai shell bash lain (pesta) yang dimulai dan pada gilirannya menghasilkan prompt perintah ($). Jadi yang kedua $ Dalam contoh di atas sebenarnya adalah cangkang bash yang berbeda, dengan yang berbeda Pid (Pid adalah pengidentifikasi proses; Pengidentifikasi nomor unik yang secara unik mengidentifikasi setiap proses berjalan dalam sistem operasi). Akhirnya kami keluar dari subshell via KELUAR dan kembali ke subshell induk! Bisakah kita membuktikan bahwa inilah yang benar -benar terjadi? Ya:

$ ECHO $ ​​220250 $ BASH $ ECHO $ ​​222629 $ EXIT EXIT $ ECHO $ ​​220250 $ 

Ada variabel khusus dalam pesta $$, yang berisi Pid dari shell saat ini yang digunakan. Dapatkah Anda melihat bagaimana pengidentifikasi proses diubah begitu kami berada di dalam subshell?

Besar! Sekarang kita tahu apa itu subkilasi, dan sedikit tentang cara kerjanya, mari selami beberapa contoh pengkodean multi-utas dan pelajari lebih lanjut!

Multi-threading sederhana dalam pesta

Mari kita mulai dengan contoh multi-threaded one-liner sederhana, di mana output mungkin terlihat agak membingungkan pada awalnya:

$ untuk saya dalam $ (seq 1 2); lakukan gema $ i; selesai 1 2 $ untuk saya dalam $ (seq 1 2); do echo $ i & selesai [1] 223561 1 [2] 223562 $ 2 [1]- Done echo $ i [2]+ selesai echo $ i $ 

Yang pertama untuk loop (lihat artikel kami tentang loop bash untuk mempelajari cara kode loop
), kami cukup mengeluarkan variabel $ i yang akan berkisar dari 1 hingga 2 (karena penggunaan perintah SEQ kami), yang - menarik - dimulai pada subshell!

CATATAN
Anda dapat menggunakan $ (...) sintaksis di mana saja Di dalam baris perintah untuk memulai subshell: ini adalah cara yang sangat kuat dan serbaguna untuk kode subshells secara langsung ke baris perintah lainnya!

Di yang kedua untuk Loop, kami hanya mengubah satu karakter. Bukannya menggunakan ; - Idiom sintaks bash eol (akhir baris) yang mengakhiri perintah yang diberikan (Anda mungkin memikirkannya seperti ENTER/EXECUTE/MOWADE), kami menggunakan &. Perubahan sederhana ini membuat program yang hampir sama sekali berbeda, dan kode kami sekarang multi-threaded! Kedua Echo akan memproses lebih atau kurang pada saat yang sama, dengan keterlambatan kecil dalam sistem operasi masih harus menjalankan loop run kedua (untuk menggemakan '2').

Anda bisa memikirkannya & dengan cara yang mirip ; dengan perbedaan itu & akan memberi tahu sistem operasi untuk 'terus menjalankan perintah berikutnya, terus memproses kode' sedangkan ; akan menunggu perintah pelaksanaan saat ini (diakhiri oleh ;) untuk mengakhiri / menyelesaikan sebelum kembali ke prompt perintah / sebelum terus memproses dan menjalankan kode berikutnya.

Sekarang mari kita periksa output. Kami melihat:

[1] 223561 1 [2] 223562 $ 2 

Pada awalnya, diikuti oleh:

[1]- Done Echo $ I [2]+ Done Echo $ I $ 

Dan ada juga garis kosong di antaranya, yang merupakan hasil dari proses latar belakang yang masih berjalan sambil menunggu input perintah berikutnya (coba perintah ini beberapa kali di baris perintah, serta beberapa variasi cahaya, dan Anda akan mendapatkan a rasakan cara kerjanya).

Output pertama ([1] 223561) menunjukkan kepada kita bahwa proses latar belakang dimulai, dengan pid 223561 dan nomor pengidentifikasi 1 diberikan padanya. Kemudian, sudah sebelum skrip mencapai gema kedua (gema kemungkinan menjadi pernyataan kode yang mahal untuk dijalankan), output 1 ditampilkan.

Proses latar belakang kami tidak selesai sepenuhnya karena output berikutnya menunjukkan kami memulai subshell/thread kedua (seperti yang ditunjukkan oleh [2]) dengan pid 223562. Selanjutnya proses kedua menghasilkan 2 (“Indikatif”: Mekanisme OS dapat mempengaruhi ini) sebelum utas kedua diselesaikan.

Akhirnya, di blok kedua output, kita melihat dua proses berakhir (seperti yang ditunjukkan oleh Selesai), serta apa yang mereka eksekusi terakhir (seperti yang ditunjukkan oleh echo $ i). Perhatikan bahwa angka yang sama 1 dan 2 digunakan untuk menunjukkan proses latar belakang.

Lebih banyak multi-threading dalam bash

Selanjutnya, mari kita jalankan tiga perintah tidur, semua diakhiri oleh & (Jadi mereka mulai sebagai proses latar belakang), dan mari kita memvariasikan panjang durasi tidur mereka, jadi kita dapat lebih jelas melihat cara kerja latar belakang.

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

Output dalam hal ini harus cukup jelas. Baris perintah segera kembali setelah kami Tidur 10 & Tidur 1 & Tidur 5 & perintah, dan 3 proses latar belakang, dengan PID masing -masing ditampilkan. Saya menekan enter beberapa kali di antara keduanya. Setelah 1 detik perintah pertama selesai menghasilkan Selesai untuk pengidentifikasi proses [2]. Selanjutnya proses ketiga dan pertama diakhiri, sesuai dengan durasi tidur masing -masing. Perhatikan juga bahwa contoh ini menunjukkan dengan jelas bahwa banyak pekerjaan berjalan secara efektif, secara bersamaan, di latar belakang.

Anda mungkin juga mengambil + Masuk ke dalam contoh output di atas. Ini semua tentang kontrol pekerjaan. Kami akan melihat kontrol pekerjaan dalam contoh berikutnya, tetapi untuk saat ini penting untuk memahaminya + menunjukkan pekerjaan yang akan dikendalikan jika kita menggunakan/menjalankan perintah kontrol pekerjaan. Itu selalu menjadi pekerjaan yang ditambahkan ke daftar pekerjaan yang paling baru. Ini adalah pekerjaan default, yang selalu merupakan yang paling baru ditambahkan ke daftar pekerjaan.

A - menunjukkan pekerjaan yang akan menjadi default berikutnya untuk perintah kontrol pekerjaan jika pekerjaan saat ini (pekerjaan dengan + tanda) akan berakhir. Kontrol pekerjaan (atau dengan kata lain; penanganan utas latar belakang) mungkin terdengar agak menakutkan pada awalnya, tetapi sebenarnya sangat berguna dan mudah digunakan setelah Anda terbiasa dengannya. Ayo menyelam!

Kontrol Pekerjaan di Bash

$ tidur 10 & tidur 5 & [1] 7468 [2] 7469 $ Jobs [1]- Berlari tidur 10 & [2]+ Berlari tidur 5 & $ fg 2 tidur 5 $ fg 1 tidur 10 $ $ 

Di sini kami menempatkan dua tidur di latar belakang. Setelah mereka dimulai, kami memeriksa pekerjaan yang sedang berjalan dengan menggunakan pekerjaan memerintah. Selanjutnya, utas kedua ditempatkan di latar depan dengan menggunakan FG Perintah diikuti oleh nomor pekerjaan. Anda dapat memikirkannya seperti ini; itu & dalam Tidur 5 Perintah diubah menjadi ;. Dengan kata lain, proses latar belakang (tidak menunggu) menjadi proses latar depan.

Kami kemudian menunggu Tidur 5 perintah untuk menyelesaikan dan kemudian menempatkan Tidur 10 memerintahkan ke latar depan. Perhatikan bahwa setiap kali kami melakukan ini, kami harus menunggu proses latar depan untuk menyelesaikan sebelum kami menerima baris perintah kami kembali, yang tidak terjadi ketika hanya menggunakan proses latar belakang (karena mereka secara harfiah 'berjalan di latar belakang').

Kontrol Pekerjaan di Bash: Gangguan Pekerjaan

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

Di sini kita menekan Ctrl+Z untuk mengganggu tidur berjalan 10 (yang berhenti seperti yang ditunjukkan oleh Berhenti). Kami kemudian menempatkan proses ke latar belakang dan akhirnya meletakkannya di latar depan dan menunggu sampai selesai.

Kontrol Pekerjaan di Bash: Gangguan Pekerjaan

$ sleep 100 ^z [1]+ berhenti tidur 100 $ kill %1 $ [1]+ Diakhiri tidur 100 

Setelah memulai 100 detik tidur, Kami selanjutnya mengganggu proses berjalan oleh Ctrl+Z, dan kemudian membunuh proses latar belakang yang dimulai/berjalan pertama dengan menggunakan membunuh memerintah. Perhatikan bagaimana kami menggunakan %1 dalam hal ini, bukan sederhana 1. Ini karena kami sekarang bekerja dengan utilitas yang tidak terkait secara alami dengan proses latar belakang, seperti FG Dan bg adalah. Jadi, untuk menunjukkan untuk membunuh bahwa kami ingin mempengaruhi proses latar belakang pertama, kami gunakan % diikuti oleh nomor proses latar belakang.

Kontrol Pekerjaan di Bash: Proses Diserahkan

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

Dalam contoh terakhir ini, kami kembali mengakhiri berlari tidur, dan letakkan di latar belakang. Akhirnya kami menjalankan menyangkal Perintah yang dapat Anda baca sebagai: Disassociate semua proses latar belakang (pekerjaan) dari shell saat ini. Mereka akan terus berjalan, tetapi tidak lagi 'dimiliki' oleh cangkang saat ini. Bahkan jika Anda menutup cangkang dan keluar Anda saat ini, proses ini akan terus berjalan sampai mereka secara alami berakhir.

Ini adalah cara yang sangat kuat untuk mengganggu proses, menempatkannya di latar belakang, menyangkalnya dan kemudian keluar dari mesin yang Anda gunakan, asalkan Anda tidak perlu berinteraksi dengan proses lagi. Ideal untuk proses berjalan yang lama di atas SSH yang tidak dapat terganggu. Cukup ctrl+z proses (yang sementara memotongnya), letakkan di latar belakang, menyangkal semua pekerjaan, dan keluar! Pulanglah dan semoga malam Anda santai mengetahui pekerjaan Anda akan terus berjalan!

Contoh Baris Perintah Scripting & Proses Manajemen Multi-Threaded

Kesimpulan

Dalam tutorial ini kami melihat cara menerapkan satu kalimat bash multi-threaded langsung dari baris perintah, dan mengeksplorasi mengapa pengkodean multi-threaded sering meningkatkan kinerja skrip Anda. Kami juga memeriksa bagaimana proses latar belakang dan latar depan bekerja, dan kami memanipulasi antrian pekerjaan. Akhirnya kami mengeksplorasi cara melepaskan antrian pekerjaan kami dari proses saat ini, memberikan kami kontrol tambahan atas proses berjalan. Nikmati keterampilan baru Anda yang ditemukan, dan tinggalkan komentar di bawah ini dengan pengalaman kontrol pekerjaan Anda!

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Menguasai loop skrip bash
  • Manajemen proses latar belakang bash
  • Loop bersarang dalam skrip bash
  • Ubuntu 20.04 Panduan
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Tips dan trik Contoh Baris Penggunaan BASH yang Berguna - Bagian 6
  • Tutorial debugging GDB untuk pemula