Nowe posty

Autor Wątek: Podstawy  (Przeczytany 2886 razy)

masa

  • Gość
Podstawy
« dnia: 2009-09-09, 11:11:24 »
Witam

Jak to jest z wykonywaniem kolejnych procesów, instrukcji, ze skryptu shell'owego? Czy wykonują się one w jakiś sposób równolegle, jeden po drugim, jak się do tego mają procesy puszczane w tle? Jak wyświetlę listę procesów to jest ich przynajmniej kilka: czy one pracują równolegle, na czym to polega, a jak to jest ze skryptem? Czy następna linia kodu nie zostanie wykonana dopóki poprzednia nie zakończy działania? Czy jeżeli mam skrypt z nieskończoną pętla w której aktualizuję bazę danych a potem te dane przetwarzam to czy istnieje możliwość, że te dwa zadania jakoś na siebie wejdą i będę operował na niespójnych danych (w bazie nie używam procedur)? Jak się ma do tego wszystkiego ilość procesorów w systemie na którym to ma działać?
Nie będę ukrywał że z Linuxa czy programowaniu w Bash'u to jestem totalną lamą. Niby mam jakieś podstawy, ale przez to tez mnóstwo wątpliwości które chciałbym rozwiać. Może mógłby mnie ktoś skierować do odpowiedniej literatury, napisać kilka prostych zdań które rozwieją te wątpliwości czy nakierują na właściwą drogę?

Jeśli zadaję pytania na które odpowiedzi są w jakimś niewidzialnym dla mnie FAQ to przepraszam za zaśmiecanie. Pytam bo odpowiedzi które uzyskałem z googla jakoś mnie usatysfakcjonowały.

arctgx

  • Gość
Podstawy
« Odpowiedź #1 dnia: 2009-09-09, 15:07:58 »
Klepnij "man bash" - jest również po polsku, tylko czasem trzeba doinstalować coś w stylu manpages-pl.
Cytat: man bash
Listy
       Lista jest potokiem lub sekwencją kilku potoków rozdzielonych jednym z operatorów ;, &, && lub
      ||, i opcjonalnie zakończoną jednym ze znaków ;, & lub .

       Spośród  tych operatorów listowych, && i || mają ten sam priorytet, następujące po nich ; i &,
       również mają równy między sobą priorytet.

       Jeśli polecenie zakończone jest operatorem sterującym &, to powłoka wykonuje je w  tle  (back‐
       ground)  w  podpowłoce.  Powłoka macierzysta nie oczekuje na zakończenie polecenia, a zwracany
       kod wynosi 0. Polecenia oddzielane znakiem średnika  ;  wykonywane  są  sekwencyjnie;  powłoka
       oczekuje na zakończenie pracy przez każde z nich po kolei. Zwracany kod jest kodem zakończenia
       ostatniego wykonanego polecenia.

       Operatory sterujące && i || oznaczają odpowiednio listy AND i OR. Lista AND ma postać

       polecenie2 wykonywane jest wtedy, i tylko wtedy, gdy polecenie1 zwraca zerowy kod zakończenia.

       Lista OR ma postać

              polecenie1 || polecenie2

       polecenie2 jest  wykonywane  wtedy,  i  tylko  wtedy,  gdy  polecenie1  zwraca  niezerowy  kod
       zakończenia.   Kod  zwracany przez listy AND i OR jest kodem zakończenia ostatniego wykonanego
       polecenia listy.
To chyba zawiera większość odpowiedzi na Twoje pytania. Wykonaj, rzecz jasna, kilka prostych skryptów, by na własne oczy przekonać się jak to działa.

{ sleep 2; echo y; } & echo x
P.S. Pytałeś jeszcze o procesy w całym systemie, a to inna bajka niż w środowisku jednego egzemplarza (procesu) powłoki.

masa

  • Gość
Podstawy
« Odpowiedź #2 dnia: 2009-10-20, 16:05:01 »
no dobra.
a jak chcę zrobić coś takiego
Cytuj
{ polecenie1; polecenie2; } & { polecenie3; polecenie4; }; inne_polecenia;
i zależy mi na tym by 'inne_polecenia' wykonały się po obudwu blokach z poleceniami. problem w tym że jeden blok ma iść w tle względem drugiego. czas wykonania bloków może się zmieniać i nie da się powiedzieć, który zakończy się pierwszy. gdy blok puszczany w tle zakończy się wykonywać, program od razu przechodzi do 'inne_polecenia'.

jak to ugryźć?

arctgx

  • Gość
Podstawy
« Odpowiedź #3 dnia: 2009-10-20, 18:37:25 »
Liczba poleceń w listach ujętych w klamry zdaje się być nieistotna dla problemu.

Nie udało mi się znaleźć prostszego rozwiązania niż ująć te dwie liczby w osobną podpowłokę i wymusić oczekiwanie na zakończenie wszystkich jej zadań tła poleceniem wait:
( { sleep 1; echo x; } & echo y; wait ); sleep 1; echo z
Gadam bzdury: ledwo to napisałem, sprawdziłem jak zadziała wait puszczony w tej samej powłoce:
{ sleep 1; echo x; } & echo y; wait; sleep 1; echo z
Ta wersja czeka aż w bieżącej powłoce zakończą się wszystkie procesy tła. Nie zawsze masz taki komfort, że tymi wszystkimi są te określone przed chwilą. Albo więc korzystasz z pierwszej wersji, albo upewniasz się, że w momencie puszczenia waita w tle działa tylko to co chcesz, albo waitowi dajesz numery zadań lub procesów i czekasz tylko na wybrane zadania. Zerknij do man bash (prawie na końcu).