Discussion:
checking that process binds a port, fuser functionality
(too old to reply)
Zdenek Maxa
2010-08-02 21:27:37 UTC
Permalink
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
Nobody
2010-08-03 08:47:55 UTC
Permalink
Post by Zdenek Maxa
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.
Roy Smith
2010-08-03 11:06:27 UTC
Permalink
Post by Nobody
Post by Zdenek Maxa
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.
Zdenek Maxa
2010-08-03 14:32:45 UTC
Permalink
-------- Original Message --------
Subject: Re: checking that process binds a port, fuser functionality
From: Roy Smith <***@panix.com>
To: python-***@python.org
Date: Tue Aug 03 2010 13:06:27 GMT+0200 (CEST)
Post by Roy Smith
Post by Nobody
Post by Zdenek Maxa
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
Roy Smith
2010-08-03 14:43:13 UTC
Permalink
Post by Zdenek Maxa
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.

Loading...