I guess we could, though I have rarely seen programs do this.  They
usually just to the std* descriptors.

---------------------------------------------------------------------------

Menno Smits wrote:
> 
> The following bug has been logged online:
> 
> Bug reference:      1958
> Logged by:          Menno Smits
> Email address:      [EMAIL PROTECTED]
> PostgreSQL version: 8.0.3
> Operating system:   Linux (Fedora Core 3)
> Description:        Postmaster doesn't close open file handles on startup
> Details: 
> 
> The postmaster process doesn't close open file handles/sockets when it
> daemonises. This means it inherits all open file handles that the parent
> process had. This can lead to strange side effects because postgres will
> hold sockets and files that it really shouldn't.
> 
> The following short Python script demonstrates the problem. It starts
> listening on TCP port 4444 and then restarts postgresql. Run with "python
> <script>.py". 
> 
> Postgresql should be running before the script is run.
> -----------------------------------------------------
> import os
> import socket
> 
> # Start listening on TCP port 444
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> s.bind(('127.0.0.1', 4444))
> s.listen(5)
> 
> # Restart postgres
> os.system('/etc/init.d/postgresql restart')
> 
> s.close()
> -----------------------------------------------------
> 
> After the script is run use the following command to see what sockets
> postmaster has:
>     netstat -tnlp | grep postmaster
> 
> The output will be something like:
> tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN  
>    5813/postmaster
> tcp        0      0 127.0.0.1:4444          0.0.0.0:*               LISTEN  
>    5813/postmaster
> 
> Port 5432 makes sense but clearly it shouldn't be listening on 4444.
> 
> Rerunning the python script will fail because postmaster still has the
> socket open:
> ------------------------------------------------------
> Traceback (most recent call last):
>   File "postgres-bug.py", line 6, in ?
>     s.bind(('127.0.0.1', 4444))
>   File "<string>", line 1, in bind
> socket.error: (98, 'Address already in use')
> ------------------------------------------------------
> 
> It is considered good UNIX programming practise to close open file handles
> when daemonising. See
> http://www.enderunix.org/docs/eng/daemon.php
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to