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