Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Strange socket problem

Reply
Thread Tools

Strange socket problem

 
 
huy
Guest
Posts: n/a
 
      06-15-2005
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
 
Reply With Quote
 
 
 
 
Jeff Epler
Guest
Posts: n/a
 
      06-15-2005
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-----

 
Reply With Quote
 
 
 
 
Magnus Lycka
Guest
Posts: n/a
 
      06-15-2005
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
> http://www.velocityreviews.com/forums/(E-Mail Removed)

 
Reply With Quote
 
nm674674@yahoo.com
Guest
Posts: n/a
 
      06-15-2005
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.

 
Reply With Quote
 
huy
Guest
Posts: n/a
 
      06-15-2005
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

 
Reply With Quote
 
huy
Guest
Posts: n/a
 
      06-15-2005
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


 
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: socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Steve Holden Python 1 02-03-2009 06:20 AM
Re: socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Steve Holden Python 0 02-01-2009 12:45 PM
Re: socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Laszlo Nagy Python 0 02-01-2009 07:37 AM
socket.unbind or socket.unlisten? - socket.error: (48, 'Addressalready in use') Laszlo Nagy Python 1 01-27-2009 05:05 PM
Re: socket.unbind or socket.unlisten? - socket.error: (48,'Address already in use') Jean-Paul Calderone Python 0 01-27-2009 01:41 PM



Advertisments