Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Re: forking and avoiding zombies!

Reply
Thread Tools

Re: forking and avoiding zombies!

 
 
peter
Guest
Posts: n/a
 
      12-10-2012
On 12/10/2012 12:42 PM, andrea crotti wrote:
> So I implemented a simple decorator to run a function in a forked
> process, as below.
>
> It works well but the problem is that the childs end up as zombies on
> one machine, while strangely
> I can't reproduce the same on mine..
>
> I know that this is not the perfect method to spawn a daemon, but I
> also wanted to keep the code
> as simple as possible since other people will maintain it..
>
> What is the easiest solution to avoid the creation of zombies and
> maintain this functionality?
> thanks
>
>
> def on_forked_process(func):
> from os import fork
> """Decorator that forks the process, runs the function and gives
> back control to the main process
> """
> def _on_forked_process(*args, **kwargs):
> pid = fork()
> if pid == 0:
> func(*args, **kwargs)
> _exit(0)
> else:
> return pid
>
> return _on_forked_process

Ou. yo need to use something more advanced. This is the code from book
('Unix Network Programing' - the python implementation)

import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
# Perform first fork.
try:
pid = os.fork( )
if pid > 0:
sys.exit(0) # Exit first parent.
except OSError, e:
sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno,
e.strerror))
sys.exit(1)
# Decouple from parent environment.
os.chdir("/")
os.umask(0)
os.setsid( )
# Perform second fork.
try:
pid = os.fork( )
if pid > 0:
sys.exit(0) # Exit second parent.
except OSError, e:
sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno,
e.strerror))
sys.exit(1)
# The process is now daemonized, redirect standard file descriptors.
for f in sys.stdout, sys.stderr: f.flush( )
si = file(stdin, 'r')
so = file(stdout, 'a+')
se = file(stderr, 'a+', 0)
os.dup2(si.fileno( ), sys.stdin.fileno( ))
os.dup2(so.fileno( ), sys.stdout.fileno( ))
os.dup2(se.fileno( ), sys.stderr.fileno( ))

Put this file and named daemon.py, then just for your program by calling
import this file.

Like this.

from daemon import daemonize

def main():
while True:
print 'I'm Alive '

if __name__ == '__main__':
daemonize(stdout='/var/log/run_time.log', stderr='/var/log/error.log')
main()

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: forking and avoiding zombies! andrea crotti Python 1 12-12-2012 03:23 PM
Re: forking and avoiding zombies! peter Python 1 12-11-2012 03:15 PM
Re: forking and avoiding zombies! peter Python 0 12-11-2012 12:33 PM
Re: forking and avoiding zombies! andrea crotti Python 0 12-11-2012 11:47 AM
forking and avoiding zombies! andrea crotti Python 0 12-10-2012 03:42 PM



Advertisments