Xargs kullanarak programları paralel olarak çalıştırmak


86

Şu anda mevcut betiğim var.

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

Xargs kullanarak paralel olarak çalıştırmak istiyorum. denedim

script.sh | xargs -P8

Ancak yukarıdakileri yapmak o anda yalnızca bir kez yapılır. -N8 ile de şans yok. Döngü için komut dosyasında yürütülecek satırın sonuna & eklemek, betiği aynı anda 99 kez çalıştırmayı deneyecektir. Bir seferde yalnızca 8, toplamda 100'e kadar olan döngüyü nasıl yürütebilirim.


Başlangıçta yapmak istediğim buydu, ancak Windows kullanıyorum çünkü xargs'a başvurmak zorunda kaldım. Windows'ta GNU Parallel'i çalıştırmayı başaramadım
Olivier

Bu senaryo kendisini mi çağırıyor yoksa burada sorduğunuzda isimleri mi karıştırdınız?
Etan Reisner

Üzgünüm, başka bir komut dosyası çağırmalı. Bunu çözecektir
Olivier

Stackoverflow.com/questions/3321738/… ' nin yanıtı burada önemlidir.
Etan Reisner

Yanıtlar:


129

Gönderen xargsadam sayfası:

Bu kılavuz sayfası, xargs'ın GNU sürümünü belgeler. xargs, standart girdideki öğeleri okur, boşluklarla (çift veya tek tırnakla veya ters eğik çizgi ile korunabilir) veya yeni satırlarla sınırlandırılır ve komutu (varsayılan / bin / echo) bir veya daha fazla ilk argümanla birlikte çalıştırır. standart girişten okunan öğelerle. Standart girişteki boş satırlar dikkate alınmaz.

Bu, örneğiniz xargsiçin betiğinizden tüm çıktıyı bekliyor ve topluyor ve sonra çalışıyor demektir echo <that output>. Tam olarak o kadar yararlı ya da ne istediğini değil.

-nArgüman girişten birçok öğe (burada paralellik hakkında, kendisi tarafından, hiçbir şey) çalıştırın 'da her bir komutla nasıl kullanılacağını olduğunu.

İstediğinizi yapmak için, xargsşuna benzer bir şey yapmanız gerekir (denenmemiş):

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

Böyle bozulan.

  • printf %s\\n {0..99}- dan başına hat bir numara yazdır 0için 99.
  • Çalıştırmak xargs
    • alarak en fazla çalıştırma komutu satır başına bir argüman
    • ve bir seferde sekiz adede kadar işlem çalıştırın

8
Aslında argümanları ayrı satırlara koymanıza gerek yok; xargs kelime bölmeleri. Yani echo {0..99} |işe yarayacaktı. <<<{0..99}işe yaramıyor gibi görünüyor; <<<wordküme ayracı genişleyen kelime olarak belgelenmesine rağmen , kullanışlı olduğum bash herhangi bir sürümünde bunu yapmıyor.
rici

1
@rici İşte Belgeler için dokümantasyon sonra özellikle bir dokümantasyon böcek gibi görünüyor değil aynı zamanda olmaz ki (genişleme yaklaşık işareti söz etmeyin olsa ayracı genişleme söz (ve hızlı bir testte ya orada olmaz) için <<ama <<<öyle *shrug*). Burada dokümanlar ve buradaki dizelerde gerçekleşen ve olmayan açılımlar aklıma biraz tuhaf geliyor.
Etan Reisner

1
Örneğin satırsonu gibi farklı işlemlerden sonuçları nasıl ayırabilirsiniz?
nirvana-msu

4
Demo: 4 paralel time head -12 <(yes "1") | xargs -n1 -P4 sleep12 sleep 1komut çalıştıracak . Komut 3 saniye sürecektir.
Walter A

66

GNU Parallel ile şunları yaparsınız:

parallel script-to-run.sh input/ output/ {} ::: {0..99}

Ekleyin -P8Eğer yoksa değil işlemci çekirdek başına bir iş çalıştırmak istiyorum.

Karşısında xargso. Girişi (olsa buradaki dava),' veya "boşluk içerse bile, Doğruyu yapacak Ayrıca yapar emin farklı işlerden çıkış size olan çıkış kullanmak eğer öyleyse, değil karışık birlikte iki farklı işten yarım puan almayacağınız garantilidir.

GNU Parallel, genel bir paralelleştiricidir ve işleri aynı makinede veya ssh erişiminizin olduğu birden çok makinede paralel olarak çalıştırmayı kolaylaştırır.

4 CPU'da çalıştırmak istediğiniz 32 farklı işiniz varsa paralelleştirmenin basit bir yolu, her CPU'da 8 iş çalıştırmaktır:

Basit zamanlama

Bunun yerine GNU Parallel, bittiği zaman yeni bir süreç ortaya çıkarır - CPU'ları aktif tutar ve böylece zamandan tasarruf sağlar:

GNU Paralel zamanlama

Kurulum

GNU Parallel dağıtımınız için paketlenmemişse, root erişimi gerektirmeyen kişisel bir kurulum yapabilirsiniz. Bunu yaparak 10 saniyede yapılabilir:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

Diğer kurulum seçenekleri için http://git.savannah.gnu.org/cgit/parallel.git/tree/README adresine bakın.

Daha fazla bilgi edin

Daha fazla örnek görün: http://www.gnu.org/software/parallel/man.html

Giriş videolarını izleyin: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Eğiticiyi inceleyin: http://www.gnu.org/software/parallel/parallel_tutorial.html

Destek almak için e-posta listesine kaydolun: https://lists.gnu.org/mailman/listinfo/parallel


19
Bu soruya cevap vermiyor, xargs'ın neden aynı şeyi başaramayacağını göstermiyor.
张 实 唯

8
olumsuz oy çünkü benim için xarg tam olarak ikinci resmin gösterdiği gibi yapıyor.
noonex

3
@noonex Herkesin sizin kullandığınız xargs sürümünü kullanmadığının ve -P'nin tüm xargs sürümlerinde bulunmadığının farkında mısınız?
Ole Tange

20
Belki de hepsi bu cevabın GNU parallel yazarı tarafından verildiğinin farkında değildir.
izkeros

1
Çoğu komut dosyasını karıştıran etkileşimli bir komut isteminden dolayı ilk denemelerde açıklandığı gibi düzgün çalışmayan bir yazılım parçası üzerindeki açık reklam nedeniyle olumsuz oy verildi.
Daniel Sorichetti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.