Download: Sysadmin_warsztat
Transkrypt
Download: Sysadmin_warsztat
SYSADMIN Warsztat administratora: potoki, gniazda, blokady Porady administratora: Komunikacja międzyprocesowa Wezwanie z urzędu Uniksowe systemy operacyjne wyraźnie rozdzielają procesy, umożliwiając jednak również na swobodną komunikację między nimi. Podczas rozwiązywania problemów z systemem administrator musi mieć jasny podgląd stanu procesów. MARC ANDRÉ SELIG N ajprostszą metodą komunikacji między procesami są sygnały [1]. Jednakże technologia ta, posiada kilka ograniczeń. Przede wszystkim istnieje tylko kilka sygnałów, a to ogranicza zawartość przekazywanych komunikatów. Ponadto użytkownicy (oprócz root-a) mogą przesyłać sygnały wyłącznie do własnych procesów. Komunikacja z obcymi procesami nie jest dozwolona. Istnieje kilka innych sposobów umożliwiających komunikację międzyprocesową: począwszy od potoków, nazwanych potoków, gniazd, poprzez blokady plików, a na komunikacji międzyprocesowej systemów V i pamięci wspólnej skończywszy. Potoki W systemach operacyjnych typu Unix strumienie wejścia i wyjścia standardowego są przypisane każdemu procesowi. Proces oczekuje na dane nadchodzące standardowym strumieniem wejściowym. Kiedy użytkownik przygotowuje do wysłania wiadomość poczty elektronicznej z wiersza poleceń, program mailx użyje do odczytania tej wiadomości wejścia standardowego. W podobny sposób proces będzie przekazywał wyniki przetwarzania do standardowego strumienia wyjściowego, jeżeli nie określono tego inaczej (z reguły jest to ekran konsoli). Ponadto każdy proces posiada standardowy strumień wyjściowy przeznaczony do przekazywania informacji o występują- 66 Czerwiec 2004 cych błędach przetwarzania. Potok po prostu kieruje informacje pochodzące z wyjścia standardowego jednego procesu do wejścia standardowego innego procesu, umożliwiając w ten sposób jednemu procesowi odczytanie informacji zapisanych przez inny proces. Ta wydajna i bezpośrednia metoda komunikacji zakłada, że oba programy są uruchomione w tym samym czasie. Przeglądanie pliku zdarzeń w poszukiwaniu określonych ciągów znaków jest doskonałym przykładem na to, jak korzystać z potoków. Poniższe polecenie wykorzystuje program grep do wyszukania wszystkich wpisów GET w pliku zdarzeń Apache. Następnie wykonywane jest polecenie cut, które rozdziela pierwsze pole (zawierające adres IP klienta) i przekazuje wyniki dalej. Potem wywoływane jest polecenie uniq usuwające powtarzające się wpisy. grep GET access_log | cut -d U „ ' -f 1 | sort -n | uniq > U hosts.txt Potok wpływa wyłącznie na wejście i wyjście standardowe. Nie powoduje przeadresowania standardowego strumienia błędów. Jeżeli jeden z programów wygeneruje komunikat błędu lub alarm, to nie zostanie on przesłany do pliku hosts.txt. Zamiast tego komunikat zostanie wyświetlony bezpośrednio na terminalu. Jeżeli chcemy przeadresować standardowy www.linux-magazine.pl strumień zgłaszania błędów, musimy to zrobić sami: find /etc -type f 2>/dev/null U -print0 | xargs -0 grep -i U imap 2>&1 | less Systemy uniksowe przypisują kolejny numer każdemu nowo otwartemu plikowi. Wejście standardowe ma wartość 0, wyjście standardowe 1, a standardowy strumień błędów ma wartość 2. Zwykłe przeadresowanie do pliku >hosts.txt dotyczy deskryptora pliku 1, czyli wyjścia standardowego, podczas gdy 2>/dev/null wywołuje przeadresowanie deskryptora 2 – standardowego kanału zgłaszania błędów. Pamiętajmy, że nowe dystrybucje Linuksa wykorzystują tzw. pseudo pliki dla tych strumieni danych: /dev/fd/0, /dev/fd/1 i /dev/fd/2. Polecenie, którego użyliśmy na początku, wyszukuje pliki w katalogu /etc. Wszystkie komunikaty o błędach wysyłane są do urządzenia /dev/null, czyli do tzw. czarnej dziury. Instrukcja wyszukuje następnie w znalezionych plikach ciąg znaków imap. Kryterium wyszukiwania nie rozróżnia wielkości liter. Kombinacja 2>&1 kopiuje wszelkie komunikaty o błędach do wyjścia standardowego. Nawiasem mówiąc, kombinacja poleceń find... -print0 i xargs -0 zapewnia obsługę nazw zawierających spacje. Potoki są bardzo proste i wydajne. Jednak- Warsztat administratora: potoki, gniazda, blokady SYSADMIN poczty elektronicznej korzystają właśnie z dobrodziejstw gniazd. Większość aplikacji korzystających z gniazd działa w architekturze klient-serwer. Dobrymi przykładami klientów są takie programy jak Telnet czy Mozilla, natomiast inetd czy Potoki nazwane Apache (patrz Rysunek 1) to (named pipes) przykłady serwerów. Na ListinPotoki nazwane to po prostu potogu 1 pokazujemy prosty przyki z kolejkowaniem FIFO („pierwkład serwera opartego na protoszy na wejściu – pierwszy na wyjkole TCP. W prawdziwych apliściu”). Zamiast bezpośredniego łąkacjach procesy zwykle nie zajczenia dwóch programów, potoki mują się obsługą danych przekanazwane korzystają ze specjalnych zywanych do nich bezpośrednio. plików, do których zapisują i z któRysunek 1: Aby połączyć się bezpośrednio z wybranym serwerem, adPracujący w pętli serwer zwykle rych odczytują informacje. Do ministratorzy mogą wykorzystać polecenie telnet. Wpisanie HEAD / przekazuje te dane do procesu stworzenia tych plików używamy HTTP/1.0 i pozostawienie pustej linijki spowoduje ujawnienie pewnych potomnego, umożliwiając w ten polecenia mkfifo. Zaletą tego rozinformacji o stronie domowej miesięcznika Linux Magazine. sposób dalszą pracę serwerowi wiązania jest to, że użytkownicy np. oczekiwanie na kolejne połączenie. nie muszą uruchamiać jednocześnie wszystZwykle tworzony jest element FIFO o naGniazda występują w wielu odmianach. kich programów. Procesy mogą być inicjowazwie /dev/xconsole. Następnie, w celu wysłaTrzeba jednak wyraźnie rozróżniać gniazda ne nawet przez różnych użytkowników. Kienia komunikatu w wybrane miejsce, wystarinternetowe od gniazd uniksowych. Gniazda dy wpiszemy polecenie ls -l /tmp/mas/test, to czy odpowiednio skonfigurować system (w internetowe służą do komunikacji wykraczaplik utworzony przy pomocy mkfifo pliku /etc/syslog.conf): jącej poza jeden komputer. Natomiast gniaz/tmp/mas/test będzie wyglądał następująco: da uniksowe są dużo szybsze, mimo że ich # Kopiuje wiadomości do X konsoli zastosowanie jest ograniczone do komputera prw------- 1 mas users 0 MarU *.* |/dev/xconsole lokalnego. 7 13:17 /tmp/mas/test Przykładowo, polecenie mysql (klient MyAby wyświetlać komunikaty – administrator SQL) będzie automatycznie korzystać z gnilub bieżący użytkownik musi po prostu wpiPrawa do odczytu i zapisu mają takie same azd uniksowych jeśli będziemy próbowali sać cat /dev/xconsole. znaczenie, jak w przypadku zwykłych pliuruchomić je na tej samej maszynie co serwer. ków. Potok nazwany działa mniej więcej Wpisanie polecenia ls -l /var/lib/mysql/myw taki sam sposób, jak zwykły plik. Rezultat Gniazda sql.sock wyświetli następujące informacje: wykonania dowolnego polecenia możemy W porównaniu z potokami nazwanymi, skierować do potoku nazwanego: gniazda dodają kolejny poziom abstrakcji w komuniListing 1: kacji pomiędzy dwoma prols /etc/mail/spamassassin U Prosty serwer TCP w języku Perl cesami. W przypadku gni>/tmp/mas/test azd procesy nie muszą być #!/usr/bin/perl -w nawet uruchamiane na jedJednakże polecenie ls zostanie w tym przyuse strict; nym komputerze. Gniazda padku zablokowane, ponieważ będzie oczekiuse IO::Socket; zapewniają interfejs pomięwać na odczytanie strumienia wyjściowego, co dzy różnymi protokołami w tym wypadku nie ma zastosowania. Polecemy $socket = IO::Socket::INET->new( komunikacyjnymi, szczenie cat /tmp/mas/test, wykonane z innego terListen => 5, gólnie między typowymi minala, pozwoli uzyskać następujące dane: Proto => „tcp”, protokołami internetowyLocalPort => 2345, mi, takie jak TCP czy prolocal.cf ReuseAddr => 1, tokół UDP Inne odmiany no-osiru.cf ) gniazd, np. gniazda domeor die „Problem: $!”; ny Unix działają tylko loPotoki nazwane są wyjątkowo praktyczne, kalnie, czyli w obrębie jedszczególnie przy przekazywaniu komunikawhile (my $client = $socket->accept) { nego systemu. tów do użytkownika pracującego na konsoli my $line = <$client>; Gniazda to typowa metoX11. Wyświetlanie komunikatów bezpoprint „Connection from '. $client->peerhost. U da komunikacji w sieci Inśrednio na ekranie monitora mogłoby roz': $line'; ternet. Użytkownicy przepraszać użytkownika. Poza tym XFree nie print $client 'Demo\r\n'; glądający zasoby tej sieci, obsługuje asynchronicznego wyświetlania } czy wysyłający wiadomości tekstu poza oknem. że ich wykorzystanie jest ograniczone. Wszystkie zaangażowane procesy muszą być uruchomione równocześnie przez tego samego użytkownika, na tym samym komputerze. www.linux-magazine.pl Czerwiec 2004 67 SYSADMIN Warsztat administratora: potoki, gniazda, blokady ny do kopiowania plików przy pomocy połączenia modemowego. Użytkownicy wymagający dostępu do zasobów kontrolowanych przez semafor są zwykle Rysunek 2: Uniksowe systemy operacyjne przechowują pliki blodołączani przez root-a kad w katalogu o nazwie /var/lock. Tradycyjnie, prawo do zapido grupy uucp, co su ma grupa uucp. umożliwia im tworzenie stosownych plików blokad. W naszym przysrwxrwxrwx 1 mysql mysql 0 Feb U kładzie pokazano plik o nazwie LCK..tty13 14:24 /var/lib/mysql/U S0, który informuje o tym, że użytkownik mysql.sock mas wymaga wyłącznych praw dostępu do urządzenia /dev/ttyS0. Pliki blokad (lockfiles) Inne procesy mogą łatwo sprawdzić doOmówione do tej pory rodzaje komunikacji stępność zasobu przez odczytanie pliku blomiędzyprocesowej stają się coraz bardziej kad. Plik zawiera identyfikator wywołanego oderwane od rzeczywistości. Gniazdo doprocesu. Jeżeli proces jest nadal aktywny, meny internetowej może rozsyłać dane możemy założyć, że zasoby są wciąż wykorzyw zasadzie wszędzie. Użyteczne aplikacje stywane. W przypadku przerwania procesu, wymagają zwykle rozwiązań, które są nieco którego identyfikator jest przechowywany bardziej skomplikowane niż zwykłe przesyw pliku blokad, nowy proces może usunąć łanie sygnałów. istniejący plik blokad i stworzyć następny. Pliki blokad, zwane tradycyjnie semaforaNieprawidłowo działające procesy potrafią mi, potrafią przekazywać sporo informacji. od razu usunąć plik blokad, a nawet nie Pokazują one przede wszystkim wykorzystasprawdzać istnienia tego pliku. Jest to istotnie określonych zasobów systemowych. Przyny aspekt wielu technik blokowania zasokładowo, program wykorzystujący port szebów. Blokady pełnią w zasadzie jedynie regowy może przechowywać identyfikator funkcję doradczą, a nie obligatoryjną. Poprocesu w specjalnym pliku, który pokazuje rządne programy skorzystają z tej 'porady', obecne obciążenie tego portu na potrzeby ale to zależy tylko od programisty. procesu. Pliki blokad tego typu przechowywane są zwykle w katalogu /var/lock. Na Rysunku 2 pokazano grupę uucp, któBlokowanie pliku ra standardowo posiada uprawnienia do zaJeżeli zablokowane zasoby są zwykłym plipisu w pliku /var/lock. Program UUCP kiem w lokalnym systemie plików, nowocze(protokół umożliwiający kopiowanie plików sne systemy uniksowe potrafią radzić sobie pomiędzy różnymi systemami Unix) umożbez pliku blokady. Proces może po prostu zaliwia asynchroniczne przesyłanie plików poblokować dany plik, uniemożliwiając innym między komputerami i był szeroko stosowaprocesom dostęp do niego. Takie blokowanie plików często spotyka się w kontekście serwerów poczty elektroIPC w System V nicznej, chodzi o blokowanie buforów poczNowoczesne systemy typu Unix, takie jak Litowych /var/mail lub w /var/spool/mail. nux, mają do swojej dyspozycji, poza metoSzczególnie tutaj należy bardzo ostrożnie dami opisanymi już wcześniej, szeroką gakorzystać z możliwości blokowania, gdyż mę technik IPC (komunikacji międzyprocewiadomości pocztowe zwykle są obsługiwasowej). Funkcja biblioteczna ipc() udostępne asynchronicznie. Kiedy użytkownik usunia semafory oraz kolejkowanie komunikanie daną wiadomość pocztową, jego program tów. Wiele mechanizmów wykorzystuje różpocztowy zapisze zmiany do pliku bufora ne metody do osiągnięcia podobnych cepocztowego i usunie wiadomości. Gdyby lów, ale większość z nich zakorzeniona jest w tym samym czasie nadeszły nowe wiadow tradycji BSD. mości, to bez możliwości blokowania rezulInną interesującą metodą jest współużytkotat takiego działania mógłby być tragiczny. wanie pamięci. Technologia umożliwia Jeżeli będziemy mieli szczęście, usunięta dwóm procesom używanie wspólnego obszaru pamięci. Dzięki temu możliwa jest wiadomość będzie nadal dostępna. W najprosta i wydajna wymiana informacji. gorszym jednak przypadku nowa wiadomość zostanie umieszczona gdzieś wewnątrz pliku 68 Czerwiec 2004 www.linux-magazine.pl Listing 2: Blokowanie poczty przy pomocy semafora #!/bin/sh lockfile -ml echo Teraz mogę usuwać wiadomości. lockfile -mu Listing 3: Blokowanie poczty przy pomocy flock() #!/usr/bin/perl use Fcntl ':flock'; open (MAILBOX, '>/var/mail/$ENV{'USER'}') or die 'Nie mogę pisać do skrzynki: $!'; flock(MAILBOX, LOCK_EX); print 'Teraz moge usunąć wiadomości.\n'; flock(MAILBOX, LOCK_UN); close MAILBOX; bufora pocztowego, z którego zostanie usunięta części innych wiadomości. Tak więc, przed wykonaniem tego typu czynności następuje blokowanie bufora pocztowego przez klienta poczty. Mail Delivery Agent – czyli zazwyczaj serwer pocztowy przestrzega istniejących blokad i również nie dostarczy nowych wiadomości bez wcześniejszego zablokowania pliku bufora. Przy obsłudze poczty istnieje zresztą wiele odmian blokowania. Na Listingach 2 i 3 pokazaliśmy dwa istotne rozwiązania, które często wykorzystuje się jednocześnie. Semafor, tak jak to wcześniej opisaliśmy (/var/lock), może zostać zapisany do /var/mail i ma tę przewagę, że doskonale pracuje w takich systemach plików, jak NFS czy AFS. Blokady plików (flock() lub fcntl()) zwykle nie radzą sobie z sieciowymi systemami plików. Jeżeli jednak pracują prawidłowo, są szybsze i bardziej wydajne niż pliki blokad, a podlegające im procesy nie wymagają prawa zapisu w katalogu kolejki poczty. ■ INFO [1] Marc André Selig, „Warsztat administratora: Ręczne sterowanie – komunikacja międzyprocesowa oparta na sygnałach”, Linux Magazine 4/2004