Xargs multi-threaded dengan contoh

Xargs multi-threaded dengan contoh

Jika Anda baru xargs, atau tidak tahu apa xargs belum, silakan baca xargs kami untuk pemula dengan contoh terlebih dahulu. Jika Anda sudah terbiasa xargs, dan bisa menulis dasar xargs Pernyataan baris perintah tanpa melihat manual, maka artikel ini akan membantu Anda menjadi lebih maju xargs pada baris perintah, terutama dengan membuatnya multi-utas.

Dalam tutorial ini Anda akan belajar:

  • Cara Penggunaan xargs -P (mode multi-utas) dari baris perintah dalam bash
  • Contoh Penggunaan Lanjutan Menggunakan Multi-Threaded xargs dari baris perintah dalam bash
  • Pemahaman yang lebih dalam tentang cara melamar xargs Multi-threaded ke kode bash Anda yang ada
Xargs multi-threaded dengan contoh

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 Linux-independen
Perangkat lunak Baris perintah bash, sistem berbasis Linux
Lainnya Itu xargs Utilitas termasuk dalam shell bash secara default
Konvensi # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa

Contoh 1: Memanggil shell bash lain dengan input yang dikompilasi oleh Xargs



Setelah satu digunakan untuk belajar xargs, Dia akan segera menemukan itu - sedangkan xargs memungkinkan seseorang melakukan banyak hal kuat dengan sendirinya - kekuatan xargs tampaknya dibatasi oleh ketidakmampuannya untuk menjalankan beberapa perintah secara berurutan.

Misalnya, katakanlah kami memiliki direktori yang memiliki subdirektori bernama 00 ke 10 (Total 11). Dan, untuk masing -masing subdirektori ini, kami ingin melintasi itu, dan periksa apakah file bernama mengajukan.txt ada, dan jika demikian kucing (dan gabungkan menggunakan >>) Isi file ini ke file Total_file.txt di direktori di mana 00 ke 10 direktori adalah. Mari kita coba dan lakukan ini xargs dalam berbagai langkah:

$ mkdir 00 01 02 03 04 05 06 07 08 09 10 $ ls 00 01 02 03 04 05 06 07 08 09 10 $ ECHO 'A'> 03/file.txt $ echo 'b'> 07/file.txt $ echo 'c'> 10/file.txt 

Di sini kami pertama kali membuat 11 direktori, 00 ke 10 dan selanjutnya buat 3 sampel mengajukan.txt file di subdirektori 03, 07 Dan 10.

$ find . -MAXDEPTH 2 -Type F -Name File.txt ./10/file.txt ./07/file.txt ./03/file.txt 

Kami kemudian menulis a menemukan Perintah untuk menemukan semua mengajukan.txt file yang dimulai dari direktori saat ini (.) dan itu hingga maksimum 1 level subdirektori:

$ find . -MAXDEPTH 2 -Type F -Name File.txt | xargs -i  cat > ./total_file.txt $ cat total_file.txt c b a 

Itu -MaxDepth 2 menunjukkan direktori saat ini (1) dan Semua subdirektori dari direktori ini (karenanya MaxDepth dari 2).

Akhirnya kami menggunakan xargs (dengan yang direkomendasikan dan disukai string pengganti seperti yang diteruskan ke xargs -SAYA ganti string opsi) untuk kucing konten file tersebut yang terletak oleh menemukan Perintah ke dalam file di direktori saat ini bernama Total_file.txt.

Sesuatu yang menyenangkan untuk dicatat di sini adalah itu, meskipun orang akan memikirkannya xargs sebagai selanjutnya mengeksekusi beberapa kucing Perintah semua pengalihan ke file yang sama, orang dapat menggunakan > (output ke file baru, membuat file jika belum ada, dan menimpa file apa pun dengan nama yang sama sudah ada) alih-alih >> (Tambahkan file, dan buat file jika belum ada)!



Latihan sejauh ini semacam memenuhi persyaratan kami, tetapi tidak sesuai dengan persyaratan dengan tepat - yaitu, itu tidak melintasi subdirektori. Itu juga tidak menggunakan >> pengalihan seperti yang ditentukan, meskipun menggunakannya dalam kasus ini masih akan berhasil.

Tantangan dengan menjalankan beberapa perintah (seperti yang spesifik CD Perintah diperlukan untuk mengubah direktori/melintasi ke subdirektori) dari dalam xargs adalah 1) mereka sangat sulit untuk kode, dan 2) mungkin tidak mungkin untuk mengkode ini sama sekali.

Namun ada cara yang berbeda dan mudah dipahami untuk mengkode ini, dan begitu Anda tahu bagaimana melakukan ini, Anda mungkin akan menggunakan ini dalam banyak hal. Ayo menyelam.

$ rm total_file.txt 

Kami pertama kali membersihkan output kami sebelumnya.

$ ls -d--color = tidak pernah [0-9] [0-9] | xargs -i  echo 'cd ; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; Fi 'CD 00; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 01; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 02; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 03; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 04; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 05; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 06; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 07; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 08; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 09; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; FI CD 10; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; fi 

Selanjutnya, kami merumuskan perintah, kali ini menggunakan ls yang akan mencantumkan semua direktori yang sesuai dengan [0-9] [0-9] Ekspresi reguler (Baca Regex Bash Advanced kami dengan Contoh Artikel untuk informasi lebih lanjut tentang Ekspresi Reguler).

Kami juga menggunakan xargs, Tapi kali ini (dibandingkan dengan contoh sebelumnya) dengan gema Perintah yang akan menghasilkan apa yang ingin kami lakukan, bahkan jika itu membutuhkan lebih dari satu atau banyak perintah. Pikirkan ini seperti skrip mini.

Kami juga menggunakan CD untuk mengubah menjadi direktori sebagaimana tercantum oleh LS -D Perintah (hanya direktori) (yang sebagai catatan tambahan dilindungi oleh --warna = tidak pernah Klausa mencegah kode warna di ls output dari memiringkan hasil kami), dan periksa apakah file tersebut mengajukan.txt ada di subdirektori dengan menggunakan Jika [-r… memerintah. Jika ada, kami kucing itu mengajukan.txt ke dalam … /Total_file.txt. Perhatikan .. sebagai CD dalam perintah telah menempatkan kami di subdirektori!

Kami menjalankan ini untuk melihat cara kerjanya (bagaimanapun, hanya gema dieksekusi; Tidak ada yang benar -benar akan terjadi). Kode yang dihasilkan tampak hebat. Mari kita ikuti selangkah lebih maju sekarang dan benar -benar menjalankan hal yang sama:

$ ls -d--color = tidak pernah [0-9] [0-9] | xargs -i  echo 'cd ; jika [-r ./mengajukan.txt ]; lalu file kucing.txt >>… /total_file.txt; fi '| xargs -i  bash -c "" $ cat total_file.txt a b c 


Kami sekarang mengeksekusi skrip total dengan menggunakan spesifik (dan selalu sama, saya.e. Anda akan menemukan diri Anda menulis | xargs -i bash -c "" dengan beberapa keteraturan) perintah, yang mengeksekusi apa pun yang dihasilkan oleh gema mendahului itu: xargs -i bash -c "". Pada dasarnya ini memberi tahu juru bahasa untuk menjalankan apa pun yang diteruskan ke sana - dan ini untuk kode apa pun yang dihasilkan. Sangat kuat!

Contoh 2: Xargs multi-threaded

Di sini kita akan melihat dua berbeda xargs perintah, satu dieksekusi tanpa eksekusi paralel (multi-threaded), yang lain dengan. Pertimbangkan perbedaan antara dua contoh berikut:

$ waktu untuk saya dalam $ (SEQ 1 5); do echo $ [$ acak % 5 + 1]; selesai | xargs -i  echo "sleep ; echo 'selesai!  '"| xargs -i  bash -c"  "selesai! 5 selesai! 5 selesai! 2 selesai! 4 selesai! 1 NYATA 0M17.016S Pengguna 0m0.017S SYS 0M0.003S 
$ waktu untuk saya dalam $ (SEQ 1 5); do echo $ [$ acak % 5 + 1]; selesai | xargs -i  echo "sleep ; echo 'selesai!  '"| xargs -p5 -i  bash -c"  "selesai! 1 selesai! 3 selesai! 3 selesai! 3 selesai! 5 NYATA 0M5.019S Pengguna 0M0.036S SYS 0M0.015S 

Perbedaan antara dua baris perintah yang sebenarnya kecil; Kami hanya menambahkan -P5 di baris perintah kedua. Namun runtime (sebagaimana diukur dengan waktu awalan perintah) signifikan. Mari kita cari tahu mengapa (dan mengapa output berbeda!).



Dalam contoh pertama, kami membuat a untuk loop yang akan berjalan 5 kali (karena subshell $ (SEQ 1 5) menghasilkan angka dari 1 ke 5) dan di dalamnya kami menggemakan angka acak antara 1 dan 5. Selanjutnya, jauh lebih sesuai dengan contoh terakhir, kami mengirim output ini ke perintah tidur, dan juga menghasilkan durasi tidur sebagai bagian dari yang selesai! gema. Akhirnya kami mengirim ini untuk dijalankan oleh perintah bash subshell, sekali lagi dengan cara yang mirip dengan contoh terakhir kami.

Output dari perintah pertama berfungsi seperti ini; melakukan tidur, hasil output, menjalankan tidur berikutnya, dan seterusnya.

Namun perintah kedua benar -benar mengubah ini. Di sini kami menambahkan -P5 yang pada dasarnya memulai 5 utas paralel sekaligus!

Cara perintah ini bekerja adalah: Mulai hingga X Threads (sebagaimana didefinisikan oleh opsi -p) dan memprosesnya secara bersamaan. Saat utas selesai, ambil input baru segera, jangan menunggu utas lain selesai terlebih dahulu. Bagian terakhir dari deskripsi itu tidak berlaku di sini (hanya jika ada lebih sedikit utas yang ditentukan oleh -P maka jumlah 'baris' input yang diberikan, atau dengan kata lain utas paralel kurang akan tersedia daripada jumlah baris input).

Hasilnya adalah bahwa utas yang selesai pertama - yang memiliki waktu tidur acak pendek - kembali dulu, dan output 'selesai!' penyataan. Total runtime juga turun dari sekitar 17 detik menjadi sekitar 5 detik tepat dalam waktu jam nyata. Dingin!

Kesimpulan

Menggunakan xargs adalah salah satu yang paling canggih, dan juga salah satu cara yang paling kuat, untuk membuat kode dalam bash. Tapi itu tidak berhenti hanya menggunakan xargs! Dalam artikel ini kami dengan demikian mengeksplorasi eksekusi paralel multi-threaded melalui -P opsi untuk xargs. Kami juga melihat panggilan subskil menggunakan $ () dan akhirnya kami memperkenalkan metode untuk meneruskan pernyataan multi-perintah langsung xargs dengan menggunakan a Bash -C panggilan subskil.

Kuat? Kami pikir begitu! Tinggalkan pikiran Anda.

Tutorial Linux Terkait:

  • Contoh tentang Cara Menggunakan Perintah XArgs di Linux
  • Multi-threaded Bash Scripting & Manajemen Proses di…
  • xargs untuk pemula dengan contoh
  • Menguasai loop skrip bash
  • Cara menggunakan subshells bash di dalamnya jika pernyataan
  • Perintah Linux Dasar
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Perintah Linux: 20 perintah terpenting teratas yang Anda butuhkan untuk…
  • Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
  • Hal -hal yang harus diinstal pada ubuntu 20.04