2012-07-14 17 views
11

Mam plik zawierający wiersze polecenia, które chcę uruchomić. Ten plik zawiera około 2000 linii.Jak mogę uruchomić listę poleceń równolegle?

Mam 8 rdzeni dostępnych. Czy jest możliwe przeanalizowanie pliku i uruchomienie 8 procesów, a następnie wykonanie kolejnego z pliku po zakończeniu jednego z programów? Chcę to kontynuować do końca pliku.

+0

Patrz [Zarządzanie procesami] (http://mywiki.wooledge.org/ProcessManagement). –

Odpowiedz

18

Możesz użyć xargs do odczytu w pliku, ograniczając maksymalną liczbę procesów do liczby dostępnych rdzeni. Na przykład:

cores=$(fgrep -c processor /proc/cpuinfo) 
xargs --arg-file=/tmp/foo \ 
     --max-procs=$cores \ 
     --replace \ 
     --verbose \ 
     /bin/sh -c "{}" 
+1

Najlepsze rozwiązanie –

0

Możesz rozpocząć nowe procesy w tle, po prostu wykonując polecenie z &. Istnieje przykład: here opisujący rozwiązanie twojego problemu.

28

Użyj GNU parallel. To niezwykle potężne narzędzie, a oficjalne pakiety istnieją dla około 20 takich dystrybucji Linuksa. Co to jest? You have an excuse as to why you can't use it? Oto prosty przykład pokazujący jak uruchomić listę lub plik poleceń równolegle:

zawartość jobs.txt:

sleep 1; echo "a" 
sleep 3; echo "b" 
sleep 2; echo "c" 

polecenie:

time parallel :::: jobs.txt 

wyniki:

a 
c 
b 

real 0m3.332s 
user 0m0.170s 
sys  0m0.037s 

Notatki:

Jeśli chcesz zachować porządek taki sam jak wejście, przekaż flagę -k na GNU równoległe.

Jeśli masz więcej niż osiem rdzeni i chcesz przetwarzać tylko osiem rdzeni, dodaj -j 8 do listy argumentów.

man page to dobra lektura, ale jeśli jeszcze nie przeczytałeś this tutorial, gorąco poleciłbym inwestycję czasową.

+0

Równoległość GNU nie jest dostępna w Ubuntu 11.10, ale jest dostępna na sidach Debiana. Warto również zauważyć, że ten przykład * nie * działa tak jak jest z równoległym narzędziem z pakietu moreutils, który ma inną semantykę. –

+0

-j 8 nie jest potrzebne - jest automatycznie wykrywane. Pakiet Ubuntu: https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 –

+0

Aby uruchomić komendę z pliku równolegle, można wykonać polecenie 'cat/path/to/file .txt | równoległy' –

Powiązane problemy