From: Zdenek Maxa on
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
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
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
-------- 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
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.