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?