GNU/Linux >> Belajar Linux >  >> Linux

Pelajari skrip Bash Multi-Threading dengan GNU Parallel

Jika Anda bosan dengan skrip Bash Anda yang membutuhkan waktu lama untuk dijalankan, tutorial ini cocok untuk Anda. Seringkali, Anda dapat membuat skrip Bash secara paralel, yang secara dramatis dapat mempercepat hasilnya. Bagaimana? Menggunakan utilitas GNU Parallel, juga disebut Parallel, dengan beberapa contoh GNU Parallel yang praktis!

Parallel mengeksekusi skrip Bash secara paralel melalui konsep yang disebut multi-threading. Utilitas ini memungkinkan Anda untuk menjalankan pekerjaan yang berbeda per CPU, bukan hanya satu, mengurangi waktu untuk menjalankan skrip.

Dalam tutorial ini, Anda akan mempelajari skrip Bash multi-threading dengan banyak contoh Paralel GNU yang hebat!

Prasyarat

Tutorial ini akan penuh dengan demonstrasi langsung. Jika Anda berniat untuk mengikuti, pastikan Anda memiliki yang berikut ini:

  • Komputer Linux. Distribusi apa pun akan berfungsi. Tutorial menggunakan Ubuntu 20.04 yang berjalan di Windows Subsystem for Linux (WSL).
  • Masuk dengan pengguna dengan hak istimewa sudo.

Menginstal GNU Paralel

Untuk mulai mempercepat skrip Bash dengan multithreading, Anda harus menginstal Paralel terlebih dahulu. Jadi, mari kita mulai dengan mengunduh dan menginstalnya.

1. Buka terminal Bash.

2. Jalankan wget untuk mengunduh paket Paralel. Perintah di bawah ini mengunduh versi terbaru (parallel-latest ) ke direktori kerja saat ini.

wget https://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2

Jika Anda lebih suka menggunakan GNU Parallel versi lama, Anda dapat menemukan semua paket di situs unduhan resmi.

3. Sekarang, jalankan perintah tar di bawah ini untuk membatalkan pengarsipan paket yang baru saja Anda unduh.

Di bawah, perintah menggunakan x tandai untuk mengekstrak arsip, j untuk menentukan bahwa itu menargetkan arsip dengan .bz2 ekstensi, dan f untuk menerima file sebagai input ke perintah tar. sudo tar -xjf parallel-latest.tar.bz2

sudo tar -xjf parallel-latest.tar.bz2

Anda sekarang harus memiliki direktori bernama parallel- dengan bulan, hari, dan tahun rilis terbaru.

4. Navigasikan ke folder arsip paket dengan cd . Dalam tutorial ini, folder arsip paket disebut parallel-20210422 , seperti yang ditunjukkan di bawah ini.

5. Selanjutnya, build dan install GNU Parallel binary dengan menjalankan perintah berikut:

./configure
 make
 make install

Sekarang, verifikasi bahwa Paralel diinstal dengan benar dengan memeriksa versi yang diinstal.

parallel --version

Saat menjalankan Paralel untuk pertama kalinya, Anda mungkin juga melihat beberapa baris menakutkan yang menampilkan teks seperti perl: warning: . Pesan peringatan tersebut menunjukkan bahwa Paralel tidak dapat mendeteksi pengaturan lokal dan bahasa Anda saat ini. Tapi jangan khawatir tentang peringatan itu untuk saat ini. Anda akan mempelajari cara memperbaiki peringatan tersebut nanti.

Mengonfigurasi GNU Paralel

Sekarang Parallel sudah terinstal, Anda bisa langsung menggunakannya! Tapi pertama-tama, penting untuk mengonfigurasi beberapa pengaturan kecil sebelum memulai.

Saat masih di terminal Bash Anda, setujui izin penelitian akademik Paralel GNU yang memberi tahu Paralel bahwa Anda akan mengutipnya dalam penelitian akademik apa pun dengan menentukan citation parameter diikuti oleh will cite .

Jika Anda tidak ingin mendukung GNU atau pengelolanya, persetujuan untuk mengutip tidak diperlukan untuk menggunakan GNU Paralel.

parallel --citation
will cite

Ubah lokal dengan mengatur variabel lingkungan berikut dengan menjalankan baris kode di bawah ini. Menetapkan variabel lingkungan lokal dan bahasa seperti ini bukanlah keharusan. Tapi GNU Parallel memeriksanya setiap kali dijalankan.

Jika variabel lingkungan tidak ada, Parallel akan mengeluhkannya setiap kali seperti yang Anda lihat di bagian sebelumnya.

Tutorial ini mengasumsikan bahwa Anda adalah seorang penutur bahasa Inggris. Bahasa lain juga didukung.

export LC_ALL=C man
export LANGUAGE=en_US
export LANG=en_US.UTF-8

Menjalankan Perintah Shell Ad-Hoc

Sekarang mari kita mulai menggunakan GNU Parallel! Untuk memulainya, Anda akan mempelajari sintaks dasar. Setelah Anda merasa nyaman dengan sintaksnya, Anda kemudian akan masuk ke beberapa contoh Paralel GNU yang berguna nanti.

Untuk memulai, mari kita bahas contoh super sederhana dengan menggemakan angka 1-5.

1. Di terminal Bash Anda, jalankan perintah berikut. Menyenangkan, bukan? Bash menggunakan perintah echo untuk mengirim angka 1-5 ke terminal. Jika Anda meletakkan masing-masing perintah ini dalam skrip, Bash akan mengeksekusi masing-masing secara berurutan, menunggu yang sebelumnya selesai.

Dalam contoh ini, Anda menjalankan lima perintah yang hampir tidak memakan waktu lama. Tapi, bayangkan jika perintah-perintah itu adalah skrip Bash yang benar-benar melakukan sesuatu yang berguna tetapi membutuhkan waktu lama untuk dijalankan?

 echo 1
 echo 2
 echo 3
 echo 4
 echo 5

Sekarang, jalankan masing-masing perintah tersebut secara bersamaan dengan Paralel seperti di bawah ini. Dalam contoh ini, Parallel menjalankan perintah echo dan ditunjuk oleh ::: , meneruskan argumen perintah itu, 1 , 2 , 3 , 4 , 5 . Tiga titik dua memberi tahu Parallel bahwa Anda memberikan input melalui baris perintah daripada pipa (lebih lanjut nanti).

Dalam contoh di bawah ini, Anda memberikan satu perintah ke Paralel tanpa opsi. Di sini, seperti semua contoh Paralel, Paralel memulai proses baru untuk setiap perintah menggunakan inti CPU yang berbeda.

# From the command line
 parallel echo ::: 1 2 3 4 5

Semua perintah Paralel mengikuti sintaks parallel [Options] .

3. Untuk mendemonstrasikan paralel menerima input dari pipa Bash, buat file bernama count_file.txt seperti di bawah ini. Setiap angka mewakili argumen yang akan Anda berikan ke perintah echo.

 1
 2
 3
 4
 5

4. Sekarang, jalankan cat perintah untuk membaca file itu dan meneruskan output ke Parallel, seperti yang ditunjukkan di bawah ini. Dalam contoh ini, {} mewakili setiap argumen (1-5) yang akan diteruskan ke Paralel.

# From the pipeline cat count_file.txt | parallel echo {}

Membandingkan Bash dan GNU Paralel

Saat ini, menggunakan Paralel mungkin tampak seperti cara yang rumit untuk menjalankan perintah Bash. Tetapi manfaat nyata bagi Anda adalah penghematan waktu. Ingat, Bash hanya akan berjalan di satu inti CPU sementara GNU Parallel akan berjalan di beberapa inti sekaligus.

1. Untuk mendemonstrasikan perbedaan perintah Bash berurutan vs. Paralel, buat skrip Bash bernama test.sh dengan kode berikut. Buat skrip ini di direktori yang sama dengan yang Anda buat count_file.txt di sebelumnya.

Skrip Bash di bawah ini membaca count_file.txt file, tidur selama 1, 2, 3, 4, dan 5 detik, menggemakan panjang tidur ke terminal, dan berakhir.

#!/bin/bash
 nums=$(cat count_file.txt) # Read count_file.txt
 for num in $nums           # For each line in the file, start a loop
 do
     sleep $num             # Read the line and wait that many seconds
     echo $num              # Print the line
 done

2. Sekarang, jalankan skrip menggunakan time perintah untuk mengukur berapa lama skrip selesai. Ini akan memakan waktu 15 detik.

time ./test.sh

3. Sekarang, gunakan time perintah lagi untuk melakukan tugas yang sama tetapi kali ini gunakan Paralel untuk melakukannya.

Perintah di bawah ini melakukan tugas yang sama tetapi kali ini, alih-alih menunggu loop pertama selesai sebelum memulai yang berikutnya, ia akan menjalankan satu di setiap inti CPU, dan memulai sebanyak mungkin pada saat yang bersamaan.

time cat count_file.txt | parallel "sleep {}; echo {}"

Ketahui Lari Kering!

Sekarang saatnya untuk masuk ke beberapa contoh GNU Paralel dunia nyata. Namun, sebelum melakukannya, Anda harus tahu dulu tentang --dryrun bendera. Bendera ini berguna ketika Anda ingin melihat apa yang akan terjadi tanpa Paralel benar-benar melakukannya.

--dryrun flag bisa menjadi pemeriksaan kewarasan terakhir sebelum menjalankan perintah yang tidak berperilaku seperti yang Anda pikirkan. Sayangnya, jika Anda memasukkan perintah yang akan membahayakan sistem Anda, satu-satunya hal yang akan dibantu oleh GNU Parallel adalah merusaknya lebih cepat!

parallel --dryrun "rm rf {}"

Contoh Paralel GNU #1:Mengunduh File dari Web

Untuk tugas ini, Anda akan mengunduh daftar file dari berbagai URL di web. Misalnya, URL ini dapat mewakili halaman web yang ingin Anda simpan, gambar, atau bahkan daftar file dari server FTP.

Untuk contoh ini, Anda akan mengunduh daftar paket arsip (dan file SIG) dari server FTP paralel GNU.

1. Buat file bernama download_items.txt, ambil beberapa tautan unduhan dari situs unduhan resmi dan tambahkan ke file yang dipisahkan oleh baris baru.

 https://ftp.gnu.org/gnu/parallel/parallel-20120122.tar.bz2
 https://ftp.gnu.org/gnu/parallel/parallel-20120122.tar.bz2.sig
 https://ftp.gnu.org/gnu/parallel/parallel-20120222.tar.bz2
 https://ftp.gnu.org/gnu/parallel/parallel-20120222.tar.bz2.sig

Anda dapat menghemat waktu dengan menggunakan pustaka Beautiful Soup Python untuk mengikis semua tautan dari halaman unduhan.

2. Baca semua URL dari download_items.txt file dan meneruskannya ke Paralel, yang akan memanggil wget dan berikan setiap URL.

cat download_items.txt | parallel wget {}

Jangan lupa {} dalam perintah paralel adalah pengganti untuk string input!

3. Mungkin Anda perlu mengontrol jumlah utas yang digunakan GNU Parallel sekaligus. Jika demikian, tambahkan --jobs atau -j parameter ke perintah. --jobs parameter membatasi jumlah utas yang dapat berjalan secara bersamaan ke nomor yang Anda tentukan.

Misalnya, untuk membatasi Paralel untuk mengunduh lima URL sekaligus, perintahnya akan terlihat seperti ini:

#!/bin/bash
 cat download_items.txt | parallel --jobs 5 wget {}

--jobs parameter pada perintah di atas dapat disesuaikan untuk mengunduh sejumlah file, selama komputer yang Anda jalankan memiliki banyak CPU untuk memprosesnya.

4. Untuk mendemonstrasikan efek dari --jobs parameter, sekarang sesuaikan jumlah pekerjaan dan jalankan time perintah untuk mengukur berapa lama waktu yang dibutuhkan setiap lari.

 time cat download_items.txt | parallel --jobs 5 wget {}
 time cat download_items.txt | parallel --jobs 10 wget {}

Contoh Paralel GNU #2:Membuka Zip Paket Arsip

Sekarang setelah Anda memiliki semua file arsip yang diunduh dari contoh sebelumnya, Anda sekarang harus membatalkan pengarsipannya.

Saat berada di direktori yang sama dengan paket arsip, jalankan perintah Paralel berikut. Perhatikan penggunaan wildcard (* ). Karena direktori ini berisi paket arsip dan file SIG, Anda harus memberi tahu Parallel untuk hanya memproses .tar.bz2 file.

sudo parallel tar -xjf ::: *.tar.bz2

Bonus! Jika Anda menggunakan GNU paralel secara interaktif (bukan dalam skrip), tambahkan --bar tandai agar Paralel menunjukkan bilah kemajuan saat tugas sedang berjalan.

Contoh Paralel GNU #3:Menghapus File

Jika Anda telah mengikuti contoh satu dan dua, Anda seharusnya sekarang memiliki banyak folder di direktori kerja Anda yang menghabiskan ruang. Jadi mari kita hapus semua file itu secara paralel!

Untuk menghapus semua folder yang dimulai dengan parallel- menggunakan Paralel, daftar semua folder dengan ls -d dan menyalurkan masing-masing jalur folder tersebut ke Paralel, menjalankan rm -rf pada setiap folder, seperti yang ditunjukkan di bawah ini.

Ingat --dryrun bendera!

ls -d parallel-*/ | parallel "rm -rf {}"

Kesimpulan

Sekarang Anda dapat mengotomatiskan tugas dengan Bash dan menghemat banyak waktu. Apa yang Anda pilih untuk dilakukan dengan waktu itu terserah Anda. Apakah menghemat waktu berarti meninggalkan pekerjaan sedikit lebih awal atau membaca posting blog ATA lainnya, sekarang saatnya kembali ke hari Anda.

Sekarang pikirkan tentang semua skrip yang berjalan lama di lingkungan Anda. Mana yang bisa Anda percepat dengan Parallel?


Linux
  1. Bash -c Dengan Parameter Posisi?

  2. Linux - Argumen Pasangan Paralel Gnu Dengan Argumen Input File?

  3. Parameter Khusus Bash Dijelaskan dengan 4 Contoh Skrip Shell

  1. Parameter Posisi Bash Dijelaskan dengan 2 Contoh Skrip Shell

  2. Nilai persentase dengan GNU Diff

  3. nama dasar dengan spasi dalam skrip bash?

  1. Selesaikan lebih banyak di baris perintah Linux dengan GNU Parallel

  2. Menggunakan Bash untuk otomatisasi

  3. Pelajari penanganan kesalahan Bash dengan contoh