Prev: let optionparse.Optionparser ignore unknown command line switches.
Next: Trying to run Python 2.7 on Windows 7 and any suggestions on books/websites for "dummies guide to python" type learning
From: Zdenek Maxa on 2 Aug 2010 17:27 Hello, I need to start a process (using subprocess.Popen()) and wait until the new process either fails or successfully binds a specified port. The fuser command seems to be indented exactly for this purpose. Could anyone please provided a hint to a handy Python library to do this or would the advice be to parse fuser command output? This needs to happen on Linux and Python 2.4. Thanks a lot in advance. Zdenek
From: Nobody on 3 Aug 2010 04:47 On Mon, 02 Aug 2010 23:27:37 +0200, Zdenek Maxa wrote: > I need to start a process (using subprocess.Popen()) and wait until the > new process either fails or successfully binds a specified port. The > fuser command seems to be indented exactly for this purpose. Could > anyone please provided a hint to a handy Python library to do this or > would the advice be to parse fuser command output? > > This needs to happen on Linux and Python 2.4. fuser (when applied to a TCP socket) scans /proc/net/tcp to obtain the inode number, then scans /proc/[1-9]*/fd/* for a reference to the inode. This requires sufficient privileges to enumerate the /proc/<pid>/fd directories (i.e. if you aren't running as root, fuser will ignore any processes which you don't own). If you just need to wait until *something* is listening on that port, you could try connect()ing to it. Alternatively, you can monitor /proc/net/tcp until the relevant port appears. If you know which process will be using the port, you can just scan the /proc/<pid>/fd directory for that process, rather than checking all processes. You still need to use /proc/net/tcp to obtain the inode number.
From: Roy Smith on 3 Aug 2010 07:06 In article <pan.2010.08.03.08.47.38.391000(a)nowhere.com>, Nobody <nobody(a)nowhere.com> wrote: > On Mon, 02 Aug 2010 23:27:37 +0200, Zdenek Maxa wrote: > > > I need to start a process (using subprocess.Popen()) and wait until the > > new process either fails or successfully binds a specified port. > > If you just need to wait until *something* is listening on that port, you > could try connect()ing to it. This certainly seems like the logical way to me. It's straight-forward, simple, and portable.
From: Zdenek Maxa on 3 Aug 2010 10:32 -------- Original Message -------- Subject: Re: checking that process binds a port, fuser functionality From: Roy Smith <roy(a)panix.com> To: python-list(a)python.org Date: Tue Aug 03 2010 13:06:27 GMT+0200 (CEST) > In article <pan.2010.08.03.08.47.38.391000(a)nowhere.com>, > Nobody <nobody(a)nowhere.com> wrote: > >> On Mon, 02 Aug 2010 23:27:37 +0200, Zdenek Maxa wrote: >> >>> I need to start a process (using subprocess.Popen()) and wait until the >>> new process either fails or successfully binds a specified port. >> If you just need to wait until *something* is listening on that port, you >> could try connect()ing to it. > > This certainly seems like the logical way to me. It's straight-forward, > simple, and portable. Yes, but I need a check that certain known process's PID listens on a defined port. connect() would certainly work, but I may end up connecting to a different process. I forgot to mention that my master daemon starts processes in question as external applications, defines port they should bind but starts them via different user via sudo, which makes checking /proc/net/tcp not possible. Well, seems it's turning out not straight-forward, but thanks a lot for your thoughts anyway! Zdenek
From: Roy Smith on 3 Aug 2010 10:43
On Aug 3, 10:32 am, Zdenek Maxa <zdenekm...(a)yahoo.co.uk> wrote: > Yes, but I need a check that certain known process's PID listens on a > defined port. connect() would certainly work, but I may end up > connecting to a different process. Then you need to define your protocol such that the client and server engage in some sort of identification / authentication exchange when they connect. Client: Who are you? Server: I am PID 12345 Client: That's not who I was expecting, I'm going away! Depending on how secure you need this to be, the exchange might include some kind of cryptographic signature. |