checking that process binds a port, fuser functionality

Z

Zdenek Maxa

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
 
N

Nobody

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.
 
R

Roy Smith

Nobody said:
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.
 
Z

Zdenek Maxa

-------- Original Message --------
Subject: Re: checking that process binds a port, fuser functionality
From: Roy Smith <[email protected]>
To: (e-mail address removed)
Date: Tue Aug 03 2010 13:06:27 GMT+0200 (CEST)
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
 
R

Roy Smith

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top