Xargs multi-threaded dengan contoh
- 812
- 131
- Simon Cormier
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
Persyaratan dan konvensi perangkat lunak yang digunakan
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