Portál AbcLinuxu, 7. června 2024 09:39

Pythonský démon

27.9.2005 10:46 | Přečteno: 1355×

Python znamená anglicky nějakého hada, myslím že hroznýše. Taky to znamená věštec. Známe pojem pýthie, to je byla věštkyně v Delfách. Nebo ovšem hroznýška. Správná česká výslovnost Pythona asi bude [pýton]. [paitn] je taky správná, ale anglická. Pythona mám rád, napsal jsem si v něm démona. Mám tam takovéhle řádky:

import os
import signal
import re
import time
import string
import sys

konrad = re.compile(r"\r*\n*$")
pidfile = "/var/run/dozorce.pid"
krok = 120 # interval mezi testy v s

A o kousek dál tohle, aby se náhodou nespustil dvakrát:

if os.path.exists(pidfile) :
   sou = open(pidfile,"r")
   r = sou.readline()
   sou.close()
   cislo = eval(konrad.sub("",r))

   try:
      os.kill(cislo,0)
   except OSError:
     # pidfile jsme stastne nasli, ale k nemu proces nebezi
     pass
   else:
     sys.stderr.write( "dozorce konci protoze proces %d uz bezi\n"%cislo )
   sys.exit(1)


A potom ještě tohle, aby se z něj udělal démon: vytvořím synovský proces a udělám ho vedoucím seance, čímž se zároveň odpojí od tty. Hodilo by se ještě přesměrování stdin, stdout, stderr někam jinam než je tty, ale to se dá i ve startovní skriptu.



# spustime se jako demon
p = os.fork()
if p > 0:
   os.waitpid(p,os.WNOHANG)
   sys.exit(0)
elif p == 0:
   # jsem synovsky proces
   os.setsid()
   sou = open(pidfile,"w")
   sou.write("%s"%os.getpid())
   sou.close()
else:
   sys.stderr.write( "dozorce nezdareny fork\n" )
   sys.exit(2)


Načež si udělám nekonečný cyklus, vždycky udělám co potřebuju a dvě minuty počkám. Zatím potřebuju hlídat na serveru, jestli mi tam někdo nežere moc paměti. Když tak mu pošlu mail, když je to ještě horší, tak ho rovnou zabiju.

Do crona jsem si dal


33 * * * * kill -0 $(cat /var/run/dozorce.pid) || /etc/init.d/dozor start

Možná je to zbytečné, třeba crona taky nerestartuju každou hodinu z crona. Ještě to nespadlo. Při zkušebním běhu jsem si dal nižší závoru a zabilo mi to X server , u kterého jsem zrovna seděl. Jojo, hlavně že to funguje.

       

Hodnocení: -

zatím nehodnoceno
        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

27.9.2005 11:12 Dag | skóre: 25 | blog: bzuk
Rozbalit Rozbalit vše python
Odpovědět | Sbalit | Link | Blokovat | Admin
Python je latinské jméno pro krajtu. Hroznýš je Boa, i když ta podčeleď Boinae je hodně veliká, Anakonda je Boinae také jmenuje se Eunectes. A tak...
To jen BTW, pokud, by to někoho zajímalo. Ale program se, myslím, jmenuje po Monthy Python. Ti ale mají jméno (pokud vím) po krajtě.(?)
27.9.2005 11:42 Jan Kundrát (jkt) | skóre: 27 | blog: jkt | Praha - Bohnice
Rozbalit Rozbalit vše Re: python
"Another important goal of the Python developers is making Python fun to use. This is reflected in the origin of the name (after the television series Monty Python's Flying Circus); in the common practice of using Monty Python references in example code; and in an occasionally playful approach to tutorials and reference materials." -- Wikipedia
27.9.2005 12:09 Dag | skóre: 25 | blog: bzuk
Rozbalit Rozbalit vše Re: python
Jo, já tušil že po Monty Pythonech, ale mám pocit, že ti se zase jmenují po krajtě (ona se tam chlapcům vyskytovala na obrázcích). Ale ono je to vcelku putna. :-)
27.9.2005 15:29 krnoha | skóre: 10 | blog: prizpevy
Rozbalit Rozbalit vše Re: python
"Another important goal of the Python developers is making Python fun to use. "

Tak, tohle na mě dejchlo před deseti lety, když jsem se náhodou dostal ke skvěle udržovanému unixovému prostředí v CERN a nazdařbůh jsem napsal

cd /usr/local/bin
ls

a viděl jsem tam něco, co vypadalo jako věštkyně. Občas je s ním vážně psina.

27.9.2005 13:11 zde | skóre: 9 | blog: Linuch | Brno
Rozbalit Rozbalit vše Asi OK, ale
Odpovědět | Sbalit | Link | Blokovat | Admin
Otestovat pomoci kill(pid, 0) zda dany PID bezi je zrejme dostatecne, ale PIDy se recyklujou. Ja ale beh demona testuju jinak:
    f = os.open (pidfile, os.O_RDWR | os.O_CREAT, 0644)
    try:
        fcntl.flock (f, fcntl.LOCK_EX | fcntl.LOCK_NB)
        # we're first!
        ...
    except IOError:
        # locked: already running
        pid = int (os.read (f, 5))
        sys.stderr.write ('%s is running, pid %d\n' % (app, pid))
        ...
Táto, ty de byl? V práci, já debil.
27.9.2005 23:32 raziel | blog: LinArchia
Rozbalit Rozbalit vše ...
Odpovědět | Sbalit | Link | Blokovat | Admin
daemonize.py
tato daemonizacia je podla mna trosku nazornejsia, ale inak celkom sympaticke.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.