[Tutor PyCZ] aplikace typu daemon

superman feed na centrum.cz
Čtvrtek Listopad 9 12:08:34 CET 2006


> Dobry den,
> uz jsem ten dotaz jednou pokladal, ale nikdo mi neporadil, mozna jsem se 
> jen nespravne vyjadril. Muzete mi doporucit vhodny zpusob, jak 
> komunikovat s aplikaci typu daemon (resp. server apliace bezici na 
> pozadi). Budu ji jiste potrebovat nejaky pokyn k ukonceni apod., 
> prozatim jsem to delal pres sit (pokynem z klienta), ale to jiste neni 
> nejlepsi zpusob, co kdyz sit nepujde. Myslim, ze na UNIX platforme se 
> pouziva napriklad zapis nejakeho retezce do specialniho souboru. Mozna 
> by toto byl zpusob, ale nevim, jak hlidat zmenu nejakeho souboru na 
> disku. Nebo znate nejaky lepsi zpusob?
> Dekuji za odpoved
> Karel

Podle mě neexistuje lepší způsob, než to udělat přes nějaký způsob 
meziprocesové komunikace. Podle mě naprosto nejlepším způsobem je, 
prostě to poslal jako povel po socketu, pokud samotný daemon po síti již 
komunikuje. Prostě si vymyslíte speciální povel, nebo datový balík, 
který vyslaný jako požadavek na server způsobí ukončení naslouchání 
novým příkazům, dokončí zpracování právě prováděných věcí a pak se ukončí.

Jako sokety si nesmíte představovat jenom TCP/IP protokol, sokety jsou 
obecný mechanismus pro komunikaci mezi procesy, záleží jaký typ soketu 
si otevřete. Některé typy soketů pak nepotřebují ani komunikaci po síti.

Jinak síť půjde vždycky, protože pokud máte nainstalovány ovladače pro 
sí%tové rozhraní, pak síť jde i na jednom počítači. Tedy můžete mít 
klienta i server na jednom počítači a pak nepůjde komunikace vůbec přes 
síťovou kartu a ani není potřeba žádný síťový hw. I jeden počítač je de 
facto síť o jednom počítači. Co Vám brání spustit si klienta na stejném 
počítači jako je server a poslat požadavek takto? Pak nepotřebujete 
žádný síťový hw ani ovladač, veškerá síťová komunikace proběhne pouze 
jako "emulace v kernelu operačního systému".

Nevím co máte proti soketům, já to považuji za dobré řešení. Hlídat 
změnu souboru na disku samozřejmě také jde, třeba ve Windows dokonce 
můžete požádat systém, aby Vás automaticky upozornil, kdykoli se na 
souborovém systému stane nějaká Vámi zadaná událost, jako je třeba 
smazání souboru, nebo změna souboru atd., takže to nemusíte programovat, 
pouze chytnete zprávu od jádra Windows. Na Linuxu v posledních jádrech 
kernelu byla podobná funkce na hlídání změn v souborovém systému také 
přidána, ale je to zatím dost čerstvé. Ale já tohle řešení považuji za 
"dirty".

Jinak na Windows je, pokud chcete zůstat v rámci jednoho počítače dobré 
řešení nastavit nějaký mutex, nebo event, nebo jiný prostředek sloužící 
původně pro synchronizaci procesů a threadů. Jednoduché, rychlé, 
elegantní, spolehlivé. Snad to dokonce lze i po síti, ale nezkoušel 
jsem. Na Linuxu samozřejmě lze mutext, condition variables a další 
používat také, ale Linux je na tyto věci hůře vybaven, i když to funguje.

Lze vymyslet řadu dalších řešení, ale nemá to smysl. Řešení se souborem 
se mi nelíbí, neboť narážíte a vyrábíte si zbytečné problémy s právy. CO 
když nebudete mít právo zapsat tam, nebo onde. Já vím, není to až takový 
problém, ale proč si lámat hlavu s problémy, které nemusíte řešit?

Miloslav Ponkrác


Další informace o konferenci Tutor