Bir bash betiğinde Çoklu İş parçacığı / Forking


9

Aşağıdaki formatta bir bash betiği yazdım:

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

whileDöngü gelen okuyacak $inFile, hat üzerinde bazı etkinlikler gerçekleştirmek ve sonucu dökümü $outFile.

As $inFile3500+ satır uzunluğundadır senaryo tamamen yürütmek için 6-7 saat sürer. Bu süreyi en aza indirmek için, bu komut dosyasında çok iş parçacıklı veya çatallı kullanmayı planlıyorum. 8 alt süreç oluşturursam, bu işlemden 8 satır $inFileaynı anda işlenir.

Bu nasıl yapılabilir?


Dikkatli olun: Farklı komut yazma gerekecektir farklı outfiles. Ayrıca, komut dosyanız yazılı olarak ilk eylem olarak girdi dosyasını siler!
pjc50

Yanıtlar:


10

GNUparallel sadece bu tür şeyler için üretilmiştir. Komut dosyanızı, her biri için girişinizdeki farklı verilerle aynı anda birçok kez çalıştırabilirsiniz:

cat input.txt | parallel --pipe your-script.sh

Varsayılan olarak, sisteminizdeki işlemci sayısına göre işlemleri ortaya çıkarır, ancak bunu ile özelleştirebilirsiniz -j N.

Özellikle düzgün bir hile, shebang sarma özelliğidir. Bash betiğinizin ilk satırını şu şekilde değiştirirseniz:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

ve veriyi standart girdi ile beslerseniz hepsi otomatik olarak gerçekleşir. Sonunda çalıştırmanız gereken temizleme kodunuz varsa, bunu yapabileceğiniz daha az yararlıdır.

Unutulmaması gereken birkaç nokta var. Birincisi, girdinizi sıralı parçalar halinde kesecek ve bunları birer birer kullanacak - satırları serpiştirmeyecek. Diğeri ise, bu kayıtların kaç kayıt olduğuna bakılmaksızın boyuta göre bölünmesidir. --block NBayt cinsinden farklı bir blok boyutu ayarlamak için kullanabilirsiniz . Sizin durumunuzda, dosya boyutunun sekizinci sayısından fazlası doğru olmamalıdır. Dosyanız, tek bir blok halinde sonlandırılacak kadar küçük olabilir, aksi takdirde amacı bozar.

Belirli farklı kullanım durumları için birçok seçenek vardır, ancak öğretici işleri oldukça iyi kapsar. Ayrıca ilginizi çekebilecek seçenekler arasında --round-robinve --group.


1
Mesele hattını test ettin mi? Birden fazla argümana sahip olan shebang'lar kaydedilemez. Linux'ta, #!a b csonuçlanacaktır ["b c"]diğer bazı sistemlerde, bu neden olurken, ["b", "c"].
nyuszika7h

1
Bu şekilde kullanıldığında kendi argümanlarını yeniden çözer (aksi takdirde seçenek fazla kullanılmaz).
Michael Homer

@MichaelHomer GNU parallelHTML sayfalarını kazımak için kullanmam gerekiyor . Bu
konudan geçebilir
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.