{ }
menu zesp贸艂 linki Logowanie

Demony, sygna艂y i unicestwianie proces贸w


Kiedy u偶ytkownik korzysta z edytora tekstu, mo偶e go w prosty spos贸b obs艂ugiwa膰, wczytywa膰 pliki, itd. Jest to mo偶liwe dzi臋ki cechom samego edytora oraz dzi臋ki temu, 偶e edytor jest pod艂膮czony do terminala. Niekt贸re programy pracuj膮 bez ci膮g艂ej komunikacji z u偶ytkownikiem, s膮 wi臋c od艂膮czone od terminala. Przyk艂adem takiego programu mo偶e by膰 serwer HTTP, nieustannie odpowiadaj膮cy na 偶膮dania pochodz膮ce z sieci, bez potrzeby komunikacji z u偶ytkownikiem. Inny przyk艂ad to programy przesy艂aj膮ce emaile pomi臋dzy komputerami.

Takie programy nazywane s膮 demonami. Demony to postaci z mitologii greckiej - niewielkie us艂u偶ne istoty, ani dobre ani z艂e, kt贸re w rozmaity spos贸b pomaga艂y ludziom. Podobnie pomagaj膮 dzisiejsze serwery pocztowe i serwery HTTP. Dlatego te偶 od d艂ugiego czasu maskotk膮 BSD jest weso艂y demon z wid艂ami i w tenis贸wkach.

Przyj臋to, i偶 programy uruchamiane jako demony maj膮 nazwy zako艅czone liter膮 "d". BIND (Berkeley Internet Name Daemon) jest serwerem nazw (uruchamianym przez program named), serwer HTTP Apache nosi nazw臋 httpd, demon kolejkowania drukarki (line printer spooling daemon) to lpd i tak dalej. Nie jest to sztywna regu艂a, lecz przyj臋ta konwencja; na przyk艂ad g艂贸wny demon pocztowy programu Sendmail nazywa si臋 sendmail, a nie maild, jak mo偶na by przypuszcza膰.

Niekiedy istnieje potrzeba komunikacji z procesem - demonem. Odbywa si臋 ona poprzez sygna艂y, to znaczy mo偶na porozumie膰 si臋 z demonem (lub jakimkolwiek dzia艂aj膮cym procesem) wysy艂aj膮c mu sygna艂. S膮 r贸偶ne rodzaje sygna艂贸w, kt贸re mo偶na wys艂a膰 - niekt贸re z nich maj膮 okre艣lone znaczenie, inne s膮 odpowiednio interpretowane przez aplikacj臋, co powinno by膰 opisane w dokumentacji aplikacji. Sygna艂 wys艂a膰 mo偶na tylko do procesu, kt贸rego jest si臋 w艂a艣cicielem. Wys艂anie sygna艂u do procesu nale偶膮cego do kogo艣 innego za po艣rednictwem kill(1) lub kill(2) spowoduje odmow臋 dost臋pu. Wyj膮tkiem jest root, kt贸ry mo偶e wysy艂a膰 sygna艂y do dowolnego procesu, niezale偶nie od jego w艂a艣ciciela.

Zdarza si臋, 偶e samo FreeBSD r贸wnie偶 wysy艂a aplikacjom sygna艂y. Je偶eli niew艂a艣ciwie napisany program pr贸buje dosta膰 si臋 do niedost臋pnego dla niego obszaru pami臋ci, FreeBSD wysy艂a procesowi sygna艂 Segmentation Violation (SIGSEGV). Aplikacja mo偶e skorzysta膰 z funkcji systemowej alarm(3), w贸wczas po up艂yni臋ciu pewnego czasu zostanie do niej wys艂any sygna艂 Alarm (SIGALRM). I tak dalej.

Do zatrzymania procesu mo偶na wykorzysta膰 dwa sygna艂y: SIGTERM i SIGKILL. Pierwszy z nich jest 艂agodnym sposobem unicestwienia procesu; proces mo偶e przechwyci膰 ten sygna艂, nast臋pnie zako艅czy膰 swoj膮 prac臋, np. zamykaj膮c pliki, kt贸re otworzy艂. Czasami proces mo偶e zignorowa膰 sygna艂 SIGTERM, je艣li akurat zajmuje si臋 czym艣, co nie powinno by膰 przerywane.

Sygna艂 SIGKILL nie mo偶e zosta膰 zignorowany. Dzia艂a wed艂ug zasady: "Nie obchodzi mnie, co robisz, w tej chwili przesta艅". Wys艂anie procesowi sygna艂u SIGKILL powoduje, i偶 FreeBSD natychmiast go wstrzymuje[1].

Inne u偶yteczne sygna艂y to SIGHUP, SIGUSR1 i SIGUSR2. S膮 to sygna艂y og贸lnego przeznaczenia, r贸偶ne aplikacje reaguj膮 na nie w r贸偶ny spos贸b.

Powiedzmy, 偶e u偶ytkownik dokona艂 zmiany w pliku konfiguracji serwera HTTP, i chcia艂by nakaza膰 serwerowi, aby konfiguracja zosta艂a ponownie wczytana. Mo偶na by zatrzyma膰 i ponownie uruchomi膰 httpd, ale ubocznym efektem takiego post臋powania by艂aby chwilowa przerwa w pracy serwera, co jest raczej niepo偶膮dane. Wi臋kszo艣膰 demon贸w dzia艂a w taki spos贸b, i偶 po otrzymaniu sygna艂u SIGHUP dokonuj膮 ponownego przeczytania swojego pliku konfiguracji. Dzi臋ki temu zamiast unicestwiania i ponownego uruchamiania httpd mo偶na wys艂a膰 mu sygna艂 SIGHUP. Nie jest jednoznacznie okre艣lone, jak procesy reaguj膮 na sygna艂 SIGHUP, dlatego r贸偶ne demony mog膮 zachowywa膰 si臋 w r贸偶ny spos贸b - w razie niepewno艣ci warto zapozna膰 si臋 z dokumentacj膮 konkretnego demona.

Sygna艂y wysy艂ane s膮 przy u偶yciu polecenia kill(1), jak w poni偶szym przyk艂adzie.

Wysy艂anie sygna艂u do procesu


W tym przyk艂adzie zaprezentowano wysy艂anie sygna艂u do inetd(8). Plik konfiguracyjny dla inetd(8) to /etc/inetd.conf, wys艂anie sygna艂u SIGHUP spowoduje ponowne przeczytanie tego pliku.

  1. Trzeba ustali膰 PID procesu, do kt贸rego wysy艂any b臋dzie sygna艂 - do tego celu pos艂u偶膮 polecenia ps(1) i grep(1). Polecenie grep(1) u偶ywane jest do odnalezienia podanego ci膮gu znak贸w. Poniewa偶 polecenia wydaje zwyk艂y u偶ytkownik, a inetd(8) dzia艂a jako as root, polecenie ps(1) musi by膰 wywo艂ane z opcj膮 ax.

    	% ps -ax | grep inetd
    	  198  ??  IWs    0:00.00 inetd -wW
    

    Jak wida膰, inetd(8) ma PID o warto艣ci 198. Niekiedy w przedstawionym powy偶ej przyk艂adzie mo偶e si臋 tak偶e pojawi膰 proces grep inetd, wynika to ze sposobu, w jaki ps(1) odnajduje dzia艂aj膮ce procesy.

  2. Proces zostanie unicestwiony przy pomocy polecenia kill(1). Najpierw trzeba jednak skorzysta膰 z polecenia su(1) by sta膰 si臋 rootem, gdy偶 inetd(8) dzia艂a jako root.
    	% su
    	Password:
    	# /bin/kill -s HUP 198
    

Podobnie jak wiele uniksowych polece艅, kill(1) nie wy艣wietla 偶adnego komunikatu w przypadku powodzenia. Je偶eli natomiast sygna艂 zosta艂 wys艂any do procesu, kt贸rego nie jest si臋 w艂a艣cicielem, pojawi si臋 informacja: "kill: PID: Operation not permitted". B艂臋dne wpisanie PID-u spowoduje albo wys艂anie sygna艂u do niew艂a艣ciwego procesu, co mo偶e sko艅czy膰 si臋 藕le, albo te偶 wys艂anie sygna艂u do PID-u kt贸ry nie jest w danej chwili wykorzystywany - pojawi si臋 w贸wczas komunikat "kill: PID: No such process".

Dlaczego powinno si臋 korzysta膰 z polecenia /bin/kill?: W wielu pow艂okach polecenie kill jest wbudowane; oznacza to, 偶e sama pow艂oka zajmuje si臋 wysy艂aniem sygna艂u, nie wywo艂uj膮c /bin/kill. Mo偶e to by膰 u偶yteczne, jednak偶e w r贸偶nych pow艂okach stosowana jest r贸偶na sk艂adnia do okre艣lenia nazwy sygna艂u, kt贸ry ma by膰 wys艂any. Zamiast wi臋c zapami臋tywania wszystkich sk艂adni, 艂atwiej jest po prostu korzysta膰 z polecenia /bin/kill ....

Inne sygna艂y wysy艂a si臋 t膮 sam膮 metod膮, wystarczy zast膮pi膰 TERM lub KILL w odpowiedni spos贸b.

Uwaga: Unicestwienie losowo wybranego procesu jest raczej z艂ym pomys艂em. Szczeg贸lne znaczenie ma init(8), proces o PID r贸wnym 1. Wydanie polecenia /bin/kill -s KILL 1 jest szybk膮 metod膮 wy艂膮czenia systemu. Nale偶y zawsze sprawdza膰 poprawno艣膰 argument贸w polecenia kill(1) przed naci艣ni臋ciem klawisza Return.

Uwagi [1]


Nie do ko艅ca jest to prawda - w kilku przypadkach nie mo偶na przerwa膰 procesu. Na przyk艂ad gdy proces stara si臋 przeczyta膰 plik znajduj膮cy si臋 na innym komputerze w sieci, i inny komputer z jakiego艣 powodu b臋dzie niedost臋pny (na skutek awarii sieci, lub po prostu zostanie wy艂膮czony), to proces stanie si臋 "nieprzerywalny". Po chwili (zwykle po dw贸ch minutach) proces przekroczy czas oczekiwania, w贸wczas zostanie unicestwiony.

T艂umaczenie: Micha艂 Wojciechowski

mlodszy, pt., 25/04/2008 - 08:11