Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Strange socket problem (http://www.velocityreviews.com/forums/t346124-strange-socket-problem.html)

huy 06-15-2005 11:25 AM

Strange socket problem
 
Hi,

I'm using cherrypy to provide a user interface for users to start a
linux server program eg. os.system("nohup myserver.py &"). The problem
is that if I stop cherrypy server and restart, I get the "Address
Already In Use" problem until I stop myserver.py. Can someone shed some
light on why this happens ? Why would the socket be held up in the other
process ?

Thanks

Huy

Jeff Epler 06-15-2005 12:32 PM

Re: Strange socket problem
 
When using os.system(), files that are open in the parent are available
in the child, as you can see here in Linux' listing of the files open by
the child program:

[jepler@sofa jepler]$ python -c 'f = open("/tmp/test", "w"); print f.fileno(); import os; os.system("ls -l /proc/self/fd")'
3
total 5
lrwx------ 1 jepler jepler 64 Jun 15 07:25 0 -> /dev/pts/2
lrwx------ 1 jepler jepler 64 Jun 15 07:25 1 -> /dev/pts/2
lrwx------ 1 jepler jepler 64 Jun 15 07:25 2 -> /dev/pts/2
l-wx------ 1 jepler jepler 64 Jun 15 07:25 3 -> /tmp/test
lr-x------ 1 jepler jepler 64 Jun 15 07:25 4 -> /proc/3108/fd

You may be able to set the FD_CLOEXEC flag on the files that should not
be passed to children, something like this:
old = fcntl.fcntl(fd, fcntl.F_GETFD)
fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
Refer to a real Unix reference for more information on what FD_CLOEXEC
does.

You may want to replace the use of os.system() with fork + close files
+ exec. Then "myserver.py" will no longer have the listening socket
descriptor of your cherrypy server.

Python 2.4's 'subprocess' module may work better in this respect than
os.system. It seems to include support for requesting that fds be
closed in the child (the close_fds parameter to subprocess.Popen)

Jeff

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)

iD8DBQFCsB/gJd01MZaTXX0RArdnAJwN9iek350cqXtYDdUzzSomz6dQIgCdF aC5
Ebd2XyIMsS+QgoLQB5jyPMU=
=9XcR
-----END PGP SIGNATURE-----


Magnus Lycka 06-15-2005 03:46 PM

Re: Strange socket problem
 
huy wrote:
> Hi,
>
> I'm using cherrypy to provide a user interface for users to start a
> linux server program eg. os.system("nohup myserver.py &"). The problem
> is that if I stop cherrypy server and restart, I get the "Address
> Already In Use" problem until I stop myserver.py. Can someone shed some
> light on why this happens ? Why would the socket be held up in the other
> process ?


As I understand it, if a socket is closed by the server, the OS
will typically hold on to the socket for a while, in case the
client wants some packages resent etc. This might be a part of
your problem.

Andrew Dalke explained it much better to me when I ran into this
some time ago. Quoted below:

> Magnus Lyckå wrote:
>> Why doesn't my socket
>> get released by the OS when I exit via my handle_error?

>
> Hi Magnus,
>
> I wrote about this at
> http://www.dalkescientific.com/writi...ng_xmlrpc.html
>
> The reason for it is described at
> http://hea-www.harvard.edu/~fine/Tech/addrinuse.html
>
> You can set the class variable "allow_reuse_address = True" in
> your derived ExitableSocketServer to get the behaviour you
> expect, at the expense of some problems mentioned in the
> above URL.
>
> Andrew
> dalke@dalkescientific.com


nm674674@yahoo.com 06-15-2005 05:05 PM

Re: Strange socket problem
 
Gurus,

I am still doing my baby steps in the wonderful world of python (so
far, so good).
However, I am quite familiar with sockets. There is a socket option
called
SO_REUSEADDR that your server should call to fix this problem.


huy 06-15-2005 10:48 PM

Re: Strange socket problem
 
Hi Jeff,

Thanks for your help. Although I haven't confirmed this, I think you
just hit my nail on the head. I thought os.system was like a totally
separate process though, i.e nothing is shared. not the usual fork()
call within the program.

Regards,

Huy

Jeff Epler wrote:
> When using os.system(), files that are open in the parent are available
> in the child, as you can see here in Linux' listing of the files open by
> the child program:
>
> [jepler@sofa jepler]$ python -c 'f = open("/tmp/test", "w"); print f.fileno(); import os; os.system("ls -l /proc/self/fd")'
> 3
> total 5
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 0 -> /dev/pts/2
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 1 -> /dev/pts/2
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 2 -> /dev/pts/2
> l-wx------ 1 jepler jepler 64 Jun 15 07:25 3 -> /tmp/test
> lr-x------ 1 jepler jepler 64 Jun 15 07:25 4 -> /proc/3108/fd
>
> You may be able to set the FD_CLOEXEC flag on the files that should not
> be passed to children, something like this:
> old = fcntl.fcntl(fd, fcntl.F_GETFD)
> fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
> Refer to a real Unix reference for more information on what FD_CLOEXEC
> does.
>
> You may want to replace the use of os.system() with fork + close files
> + exec. Then "myserver.py" will no longer have the listening socket
> descriptor of your cherrypy server.
>
> Python 2.4's 'subprocess' module may work better in this respect than
> os.system. It seems to include support for requesting that fds be
> closed in the child (the close_fds parameter to subprocess.Popen)
>
> Jeff


huy 06-15-2005 10:48 PM

Re: Strange socket problem
 
Hi Jeff,

Thanks for your help. Although I haven't confirmed this, I think you
just hit my nail on the head. I thought os.system was like a totally
separate process though, i.e nothing is shared. not the usual fork()
call within the program.

Regards,

Huy

Jeff Epler wrote:
> When using os.system(), files that are open in the parent are available
> in the child, as you can see here in Linux' listing of the files open by
> the child program:
>
> [jepler@sofa jepler]$ python -c 'f = open("/tmp/test", "w"); print f.fileno(); import os; os.system("ls -l /proc/self/fd")'
> 3
> total 5
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 0 -> /dev/pts/2
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 1 -> /dev/pts/2
> lrwx------ 1 jepler jepler 64 Jun 15 07:25 2 -> /dev/pts/2
> l-wx------ 1 jepler jepler 64 Jun 15 07:25 3 -> /tmp/test
> lr-x------ 1 jepler jepler 64 Jun 15 07:25 4 -> /proc/3108/fd
>
> You may be able to set the FD_CLOEXEC flag on the files that should not
> be passed to children, something like this:
> old = fcntl.fcntl(fd, fcntl.F_GETFD)
> fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
> Refer to a real Unix reference for more information on what FD_CLOEXEC
> does.
>
> You may want to replace the use of os.system() with fork + close files
> + exec. Then "myserver.py" will no longer have the listening socket
> descriptor of your cherrypy server.
>
> Python 2.4's 'subprocess' module may work better in this respect than
> os.system. It seems to include support for requesting that fds be
> closed in the child (the close_fds parameter to subprocess.Popen)
>
> Jeff




All times are GMT. The time now is 08:59 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.