Lumír Jasiok wrote:
Leos Pol wrote:
To me privadi na myslenku, kdyz vidim ten try, jestli nechytas vyjimku SystemExit.

David Michal wrote:
Ja teda neumim vysvetlit proc nejde exit ale co to zkusit takhle:

sysexit = False

def cleanup(signal, frame):
     """Clean up the server before shutdown.
     """
     # SIGTERM signal
     if signal == 15:
         print "Received SIGTERM signal, waiting for clients
 termination"
         while True:
             # In case that there isn't any active clients
             if not clients:
                 break
         sysexit = True

 # Nadrazena smycka:
  while not sysexit:
         # Handle the child temination
         signal.signal(signal.SIGCHLD,reap)
# Catch the SIGTERM signal
         signal.signal(signal.SIGTERM, cleanup)
         #signal.pause()
         try:
             connection,address = sock.accept()

-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of
Lumír Jasiok
Sent: Wednesday, December 17, 2008 2:26 PM
To: Konference PyCZ
Subject: [python] Problem s forkujicim serverem a SIGTERM signalem

Dobry den,

potreboval bych poradit s nasledujicim problemem. Mam napsany
jednoduchy
forkujici TCP/IP server. Server jako takovy funguje, child procesy se
vytvareji i ukoncuji korektne, jediny probleme mam s ukoncenim parent
procesu v okamziku, kdy z (napriklad shellu) zavolam signal SIGTERM.
Mam
osetreno zachyceni signalu a funkci, ktera zajisti, ze se pocka na
ukonceni vsech child procesu a pak by se mel ukoncit i parent proces
pomoci sys.exit(0). To se ale nestane, parent proces (server) se
neukonci, ale skoci do nadrazene while smycky a dale ceka na spojeni a
je schopen obsluhovat prichozi spojeni. Relevantni kod:


_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python


Ne, SystemExit nezachytavam, jeste jednou jsem zkontroloval kod, tim to nebude. Jen ze zvedavosti zkusim prijit na to, co to zpusobuje. Pokud na to prijdu, zkusim tady dat vedet, kdyby nekdo narazil na stejny problem.

Lumir

Takze nakonec to jde vyresit i pridanim zachytavani SystemExit a naslednym (brutalnim SIGKILL signalem) takto:

def cleanup(signal,frame):
   """Clean up the server before its shutdown.
   """
   # SIGTERM signal
   if signal == 15:
       print "Received SIGTERM signal, waiting for clients termination"
       while True:
           # In case that there isn't any live clients
           if not clients:
               break
       try:
           sys.exit(0)
       except SystemExit:
           os.kill(os.getpid(),9)
       except:
           traceback.print_exc

Neni to hezke, ale je to taky cesta. Co byste preferovali Vy? Prvni moznost pres promennou sysexit, nebo "hrubou silu"?

Lumir

--
Lumír Jasiok
VSB-TU Ostrava - Computer centre
Tel: +420 59 732 3189
E-mail: [email protected]
http://www.vsb.cz
                                                                                
                                        

_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem