[BASH] Kilka skryptów uruchamianych w tym samym czasie

0

Witajcie,

Na wstępie napisze ze mój problem jest związany z terminalem w Linux i poleceniem xargs który w tym samym czasie wywołuje php z wieloma różnymi argumentami.
Chciałbym napisać skrypt który wykonałby kilka razy skrypt z pliku PHP w tym samym czasie w pętli. Ogólnie to mam już działające rozwiązanie które wykonuje mi plik PHP z różnymi argv 35 razy w tym samym momencie jednak problemem jest czas jeden obrót pętli trwa mniej więcej 20sec tymczasem pojedyncze wykonanie pliku jedynie 3sec. Moje pytanie jest czy mogę to zrobić inaczej jak poprzez xargs w pętli while. Generalnie spodziewałbym się efektu gdy poprzez linuxowy terminal wywołuje command w bash który uruchamia mi 35 niezależnych php plik.php arg. Nie chciałbym przy tym wywoływać 35 terminali wszytko musiałoby się opierać na 1 oknie.

1

A sprawdzałeś man xargs? Podpowiedź, szukaj flagi -P.

0

Tak sprawdzałem i korzystam z niej ale nadal jest za wolno. Problem polega na tym ze z pośród tych wszystkich 35 wykonań prawie wszystkie trwają 3 sekundy ale nieliczne wykonują się dłużej wiec w sumie jedna iteracja wykonuje się w czasie dłuższym tzn ~25-35 sekunda. Wiec chciałbym docelowo nie wykonywać tego w xargs tylko wykonać je niezależnie tzn:
Moja obecna instrukcja wyglada mniej więcej tak:
while true
do
echo ${args} | xargs -P 35 -n 1 php test.php
done

Chciałbym docelowo zrobić 35 oddzielnych pętli while w których php nie byłoby wywoływane z xargs tylko niezależnie. Może być 35 różnych instrukcji w plikach .sh pytanie jak to wykonać z jednego Okna terminala żeby nie było na 35 terminalach.

xargs może wykonywać kilka instrukcji na raz ale i tak musi poczekać na tą najwolniejszą żeby robić coś dalej. Ja chciałbym żeby to co się wykonuje 3sekundy było wykonywane cały czas. Jeżeli wśród 35 instrukcji mam 30 trwających 3sekundy to chciałbym żeby przez 30sekund wykonało się 10 iteracji. Jeżeli mam 5 wolniejszych to niech się wykona mniej ale tylko dla nich.

1

Ale jak tak to odpalasz to wszystkie idą równolegle. Jeśli chcesz to zrobić równolegle to odpalasz sobie to tak:

seq 1 35 | xargs -P35 -n1 -I_ php test.php ${args}

Przy czym pamiętaj, że niespecjalnie jest jakikolwiek sens w argumencie do -P podawać wartość większą niż ilość procesorów, którą masz w maszynie.

0

Dodatkowym problemem może być to że ja nie wiem który argv sprawi że PHP wykona się wolniej i w danej chwili opóźni wykonanie xargs. Jest to całkowicie losowe dlatego ze skrypt łączy się z zewnętrznym API. Zależy mi na tym żeby kolejna iteracja nie była opóźniana o czas wykonania całości xargs tylko pojedynczego PHP. Dlatego chciałbym zrezygnować z xargs i znaleźć jakaś szybsza alternatywę.

0

Ostatecznie udało mi się uzyskać zamierzony efekt. Teraz korzystam z BASHA w BASHU tzn.
Mam dwa pliki SH

Pierwszy plik (bez pętli while) start.sh

echo $args | xargs -P 35 -n 1 bash start1.sh

Drugi plik (z pętlą while) start1.sh

while true
do
{
php test.php $1
}
done

To działa dużo lepiej jak xargs dla 35 skryptów w PHP. Pętle wykonują się w tempie niezależnym i cała instrukcja nie musi czekać na najwolniejsze wykonanie skryptu PHP.

Ale z góry dzięki myślę że ten temat przyda się wielu osobom którzy szukają sposobu na wykonywanie kilku rzeczy na raz :) Sam kiedyś też szukałem xargs.

1 użytkowników online, w tym zalogowanych: 0, gości: 1