2010-07-23 14 views
11

Próbuję użyć xargs w skrypcie powłoki, aby uruchomić równoległe instancje funkcji zdefiniowanej w tym samym skrypcie. Funkcja skraca czas pobierania strony, dlatego ważne jest, aby strony były pobierane jednocześnie w równoległych procesach, a nie w procesach działających w tle (jeśli moje zrozumienie tego jest złe i istnieje pomijalna różnica między tymi dwoma, daj mi znać) .Skrypty powłoki: Używanie xargs do wykonywania równoległych instancji funkcji powłoki

Funkcja:

function time_a_url() 
{ 
    oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2) 
    echo "Fetching $1 took $oneurltime seconds." 
} 

jaki sposób można to zrobić z rurą xargs w formie, która może potrwać kilka razy uruchomić time_a_url równolegle jako argument? Tak, wiem o równoległym GNU, po prostu nie mam przywileju instalowania oprogramowania, w którym to piszę.

Odpowiedz

11

Oto demo jak można być w stanie uzyskać dostęp do funkcji do pracy:

$ f() { echo "[[email protected]]"; } 
$ export -f f 
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\} 
[b 1] 
[d 3 4] 
[c 2] 

klucze do podejmowania tej pracy są export funkcja więc bash że xargs ikra będzie to widział i uciec spacja między nazwą funkcji a nawiasem klamrowym. Powinieneś być w stanie dostosować to do pracy w twojej sytuacji. Będziesz musiał dostosować argumenty dla -P i -n (lub je usunąć), aby dostosować je do swoich potrzeb.

Możesz prawdopodobnie pozbyć się grep i cut. Jeśli używasz wbudowanego Basha time, możesz określić format wyjściowy za pomocą zmiennej TIMEFORMAT. Jeśli używasz GNU /usr/bin/time, możesz użyć argumentu --format. Każda z nich pozwoli ci również zrzucić -p.

Możesz zastąpić tę część polecenia : 2>&1 1>/dev/null za pomocą -q. W każdym razie masz odwrócone. Prawidłowa kolejność to >/dev/null 2>&1.

+1

kiedyś 'xargs -p0 -N1 -I {} ciachnięcie -c "f {}"' które nadal działa, oraz wydaje się mały tidier. –

0

Jeśli zainstalujesz GNU Parallel na innym systemie, zobaczysz, że funkcjonalność jest w jednym pliku (nazywanym równoległym).

Powinieneś być w stanie po prostu skopiować ten plik do własnego ~/bin.

1

Na Mac OS X:

xargs: max. proces musi być> 0 (dla: xargs -P> [0])

f() { echo "[[email protected]]"; } 
export -f f 

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\} 

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "[email protected]"' arg0 '{}' 
Powiązane problemy