GNU/Linux >> Belajar Linux >  >> Linux

Selesaikan lebih banyak di baris perintah Linux dengan GNU Parallel

Apakah Anda pernah mendapatkan perasaan lucu bahwa komputer Anda tidak secepat yang seharusnya? Saya dulu merasa seperti itu, dan kemudian saya menemukan GNU Parallel.

GNU Parallel adalah utilitas shell untuk menjalankan pekerjaan secara paralel. Itu dapat mengurai beberapa input, sehingga menjalankan skrip atau perintah Anda terhadap kumpulan data pada saat yang bersamaan. Anda dapat menggunakan semua CPU Anda akhirnya!

Jika Anda pernah menggunakan xargs , Anda sudah tahu cara menggunakan Paralel. Jika tidak, artikel ini akan mengajari Anda, bersama dengan banyak kasus penggunaan lainnya.

Menginstal GNU Paralel

GNU Parallel mungkin belum diinstal sebelumnya di komputer Linux atau BSD Anda. Instal dari repositori atau koleksi port Anda. Misalnya, di Fedora:

$ Sudo dnf install parallel

Atau di NetBSD:

# pkg_add paralel

Jika semuanya gagal, lihat beranda proyek.

Dari serial ke paralel

Seperti namanya, kekuatan Parallel adalah menjalankan pekerjaan secara paralel daripada, seperti yang masih dilakukan banyak dari kita, secara berurutan.

Saat Anda menjalankan satu perintah terhadap banyak objek, Anda secara inheren membuat antrian. Beberapa objek dapat diproses oleh perintah, dan semua objek lainnya hanya berdiri dan menunggu giliran. Ini tidak efisien. Dengan data yang cukup, akan selalu ada antrean, tetapi daripada hanya memiliki satu antrean, mengapa tidak memiliki banyak antrean kecil?

Bayangkan Anda memiliki folder penuh gambar yang ingin Anda konversi dari JPEG ke PNG. Ada banyak cara untuk melakukan ini. Ada cara manual untuk membuka setiap gambar di GIMP dan mengekspornya ke format baru. Itu biasanya cara terburuk yang mungkin. Tidak hanya padat waktu, tetapi juga padat karya.

Variasi yang cukup rapi pada tema ini adalah solusi berbasis shell:

$ konversi 001.jpeg 001.png
$ konversi 002.jpeg 002.png
$ konversi 003.jpeg 003.png
... dan seterusnya ...

Ini adalah trik yang bagus saat Anda pertama kali mempelajarinya, dan pada awalnya ini merupakan peningkatan besar. Tidak perlu GUI dan klik konstan. Tapi itu masih padat karya.

Lebih baik lagi:

$ untuk saya di *jpeg; lakukan konversi $i $i.png; selesai

Ini, setidaknya, menggerakkan pekerjaan dan membebaskan Anda untuk melakukan hal-hal yang lebih produktif. Masalahnya, itu masih proses serial. Satu gambar dikonversi, lalu gambar berikutnya dalam antrean ditingkatkan untuk konversi, dan seterusnya hingga antrean dikosongkan.

Dengan Paralel:

$ temukan . -nama "*jpeg" | paralel -I% --max-args 1 konversi % %.png

Ini adalah kombinasi dari dua perintah:find perintah, yang mengumpulkan objek yang ingin Anda operasikan, dan perintah parallel perintah, yang memilah-milah objek dan memastikan semuanya diproses sesuai kebutuhan.

  • find . -name "*jpeg" menemukan semua file di direktori saat ini yang diakhiri dengan jpeg .
  • parallel memanggil GNU Paralel.
  • -I% membuat placeholder, yang disebut % , untuk menggantikan find whatever apa pun menyerahkan ke Paralel. Anda menggunakan ini karena jika tidak, Anda harus menulis perintah baru secara manual untuk setiap hasil find , dan itulah yang coba Anda hindari.
  • --max-args 1 membatasi tingkat di mana Parallel meminta objek baru dari antrian. Karena perintah Parallel berjalan hanya membutuhkan satu file, Anda membatasi kecepatannya menjadi 1. Apakah Anda melakukan perintah yang lebih kompleks yang membutuhkan dua file (seperti cat 001.txt 002.txt > new.txt ), Anda akan membatasi tarif menjadi 2.
  • convert % %.png adalah perintah yang ingin Anda jalankan secara Paralel.

Hasil dari perintah ini adalah find mengumpulkan semua file yang relevan dan menyerahkannya ke parallel , yang meluncurkan pekerjaan dan segera meminta yang berikutnya dalam antrean. Paralel terus melakukan ini selama aman untuk meluncurkan pekerjaan baru tanpa melumpuhkan komputer Anda. Ketika pekerjaan lama selesai, itu menggantikannya dengan yang baru, sampai semua data yang diberikan padanya telah diproses. Apa yang memakan waktu 10 menit sebelumnya mungkin hanya memakan waktu 5 atau 3 menit dengan Paralel.

Beberapa masukan

find command adalah gerbang yang sangat baik ke Parallel selama Anda terbiasa dengan find dan xargs (secara kolektif disebut GNU Find Utilities, atau findutils ). Ini menyediakan antarmuka fleksibel yang sudah nyaman bagi banyak pengguna Linux dan cukup mudah dipelajari jika Anda pendatang baru.

find perintahnya cukup mudah:Anda memberikan find dengan jalur ke direktori yang ingin Anda cari dan beberapa bagian dari nama file yang ingin Anda cari. Gunakan karakter wildcard untuk melebarkan jaring Anda; dalam contoh ini, tanda bintang menunjukkan apa saja , jadi find menempatkan semua file yang diakhiri dengan string searchterm :

$ find /path/to/directory -name "*searchterm"

Secara default, find mengembalikan hasil pencariannya satu per satu, dengan satu item per baris:

$ find ~/graphics -name "*jpg"
/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth /graphics/penguin.jpg
/home/seth/graphics/IMG_0135.jpg

Saat Anda menyalurkan hasil find ke parallel , setiap item pada setiap baris diperlakukan sebagai satu argumen untuk perintah yang parallel sedang melakukan arbitrase. Sebaliknya, jika Anda perlu memproses lebih dari satu argumen dalam satu perintah, Anda dapat membagi cara data dalam antrian diserahkan ke parallel .

Berikut adalah contoh sederhana dan tidak realistis, yang nantinya akan saya ubah menjadi sesuatu yang lebih berguna. Anda dapat mengikuti contoh ini, selama Anda telah menginstal GNU Parallel.

Asumsikan Anda memiliki empat file. Buat daftar, satu per baris, untuk melihat apa yang Anda miliki:

$ echo ada> ada; echo lovelace> lovelace
$ echo richard> richard; echo stallman> stallman
$ ls -1
ada
lovelace
richard
stallman

Anda ingin menggabungkan dua file menjadi sepertiga yang berisi konten kedua file. Ini mengharuskan Parallel memiliki akses ke dua file, jadi -I% variabel tidak akan berfungsi dalam kasus ini.

Perilaku default paralel pada dasarnya tidak terlihat:

$ ls -1 | gema paralel
ada
lovelace
richard
stallman

Sekarang beri tahu Parallel bahwa Anda ingin mendapatkan dua objek per pekerjaan:

$ ls -1 | paralel --max-args=2 echo
ada lovelace
richard stallman

Sekarang garis telah digabungkan. Secara khusus, dua hasil dari ls -1 dilewatkan ke Paralel sekaligus. Itu adalah jumlah argumen yang tepat untuk tugas ini, tetapi saat ini secara efektif hanya satu argumen:"ada lovelace" dan "richard stallman". Apa yang sebenarnya Anda inginkan adalah dua argumen berbeda untuk setiap pekerjaan.

Untungnya, teknis itu diuraikan oleh Paralel itu sendiri. Jika Anda menyetel --max-args ke 2 , Anda mendapatkan dua variabel, {1} dan {2} , mewakili bagian pertama dan kedua dari argumen:

$ ls -1 | paralel --max-args=2 cat {1} {2} ">" {1}_{2}.person

Dalam perintah ini, variabel {1} adalah ada atau richard (tergantung pada pekerjaan yang Anda lihat) dan {2} adalah lovelace atau stallman . Isi file diarahkan dengan simbol redirect dalam tanda kutip (tanda kutip mengambil simbol pengalihan dari Bash sehingga Parallel dapat menggunakannya) dan ditempatkan ke dalam file baru bernama ada_lovelace.person dan richard_stallman.person .

$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ cat ada_*person
ada lovelace
$ cat ri*person
richard stallman

Jika Anda menghabiskan sepanjang hari untuk mengurai file log yang berukuran ratusan megabita, Anda mungkin melihat bagaimana penguraian teks yang diparalelkan dapat bermanfaat bagi Anda; jika tidak, ini sebagian besar merupakan latihan demonstratif.

Namun, pemrosesan semacam ini sangat berharga untuk lebih dari sekadar penguraian teks. Berikut adalah contoh kehidupan nyata dari dunia film. Pertimbangkan direktori file video dan file audio yang perlu digabungkan.

$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
...dan seterusnya pada...

Menggunakan prinsip yang sama, perintah sederhana dapat dibuat sehingga file digabungkan secara paralel :

$ ls -1 | paralel --max-args=2 ffmpeg -i {1} -i {2} -vcodec copy -acodec copy {1}.mkv

Brengsek. Paksa.

Semua penguraian input dan output yang mewah ini tidak sesuai dengan selera semua orang. Jika Anda lebih suka pendekatan yang lebih langsung, Anda dapat melemparkan perintah ke Paralel dan pergi.

Pertama, buat file teks dengan satu perintah di setiap baris:

$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc atmosphere.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo. avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

Kemudian serahkan file tersebut ke Parallel:

$ paralel --jobs 6  

Dan sekarang semua pekerjaan di file Anda dijalankan secara Paralel. Jika ada lebih banyak pekerjaan daripada pekerjaan yang diizinkan, antrian akan dibentuk dan dipelihara oleh Paralel sampai semua pekerjaan berjalan.

Lebih banyak lagi

GNU Parallel adalah alat yang kuat dan fleksibel, dengan kasus penggunaan yang jauh lebih banyak daripada yang dapat dimasukkan ke dalam artikel ini. Halaman manualnya memberikan contoh hal-hal keren yang dapat Anda lakukan dengannya, mulai dari eksekusi jarak jauh melalui SSH hingga menggabungkan fungsi Bash ke dalam perintah Paralel Anda. Bahkan ada serangkaian demonstrasi ekstensif di YouTube, sehingga Anda dapat belajar dari tim Paralel GNU secara langsung. Pengelola utama GNU Parallel juga baru saja merilis panduan resmi perintah, tersedia dari Lulu.com.

GNU Parallel memiliki kekuatan untuk mengubah cara Anda menghitung, dan jika tidak melakukannya, setidaknya akan mengubah waktu yang dihabiskan komputer Anda untuk komputasi. Cobalah hari ini!


Linux
  1. Temukan file dan direktori di Linux dengan perintah find

  2. 8 tips untuk baris perintah Linux

  3. Diurutkan dengan sort di baris perintah

  1. Salin dan tempel di baris perintah Linux dengan xclip

  2. Bekerja dengan aliran data di baris perintah Linux

  3. Bekerja dengan pipa di baris perintah Linux

  1. Menggunakan perintah find Linux – Penggunaan dengan contoh

  2. Bagaimana cara mendapatkan jumlah bingkai dalam video di baris perintah linux?

  3. Memantau level mikrofon dengan alat baris perintah di Linux