Using select on a unix command in lieu of signal

rh0dium sklass at pointcircle.com
Mon Aug 29 20:57:34 EDT 2005


So here's how I solved this..  It's seems crude - but hey it works.
select not needed..

    def runCmd( self, cmd, timeout=None ):
        self.logger.debug("Initializing function %s - %s" %
(sys._getframe().f_code.co_name,cmd) )
        command = cmd + "\n"

        child = popen2.Popen3(command)
        t0 = time.time()

        out = None
        while time.time() - t0 < timeout:
            if child.poll() != -1:
                self.logger.debug("Command %s completed succesfully" %
cmd )
                out = child.poll()
                results = "".join(child.fromchild.readlines())
                results = results.rstrip()
                break
                print "Still waiting..", child.poll(), time.time() -
t0, t0
            time.sleep(.5)

        if out == None:
            self.logger.warning( "Command: %s failed!" % cmd)
            kill = os.kill(child.pid,9)
            self.logger.debug( "Killing command %s - Result: %s" %
(cmd, kill))
            out = results = None

        else:

            self.logger.debug("Exit: %s Reullts: %s" % (out,results))

        child.tochild.close()
        child.fromchild.close()
        return out,results

Comments..




rh0dium wrote:
> Paul Rubin wrote:
> > "rh0dium" <sklass at pointcircle.com> writes:
> > > Thanks much - Alternatively if anyone else has a better way to do what
> > > I am trying to get done always looking for better ways.  I still want
> > > this to work though..
> >
> > You don't have to use select, since you can use timeouts with normal
> > socket i/o.  So you could use threads.  3000 threads is a lot but not
> > insanely so.
>
> OK I could use the timeout.. but I am using a queue as well.  So each
> thread gets several commands.  I assumed (could be wrong) that if I use
> a timeout the whole thread gets killed not the individual process.  The
> purpose of the queue was to limit the number of concurrent workers, and
> keep the load on the machine somewaht manageable.
>
> So to add more to this here is how I call the runCmd
>
>     # Initialize a que to 25 max hosts
>     workQ = Queue.Queue(25)
>
>     # Start some threads..
>     for i in range(MAX_THREADS):
>         getReachableHosts(queue=workQ).start()
>
>     # Now give the threads something to do..  The nice thing here is
> that by
>     # waiting unil now this will hold up the queue..
>     for host in base_hosts:
>         workQ.put(host)
>
>     # After this is finally done thow a null to close the threads..
>     for i in range(MAX_THREADS):
>         workQ.put(None)
>
> And then getReachables..
>
> class getReachableHosts(threading.Thread):
>     def __init__(self,queue=None, ):
>         self.logger = logging.getLogger("metriX.%s" %
> self.__class__.__name__)
>         self.logger.info("Initializing class %s" %
> self.__class__.__name__)
>         self.__queue = queue
>         threading.Thread.__init__(self)
>
>     def run(self):
>         self.logger.debug("Initializing function %s" %
> sys._getframe().f_code.co_name )
>         while 1:
>             host = self.__queue.get(timeout=5)
>             if host is None:
>                 break
>
>             self.logger.debug("Getting open ports on %s" % host)
>             command = "nmap -p 22,514 -oG - %s | perl -lane 'print
> unless /^#/'" % host
>
>             (out,results)=self.runCmd(cmd=cmd,timeout=5)
> 
> 
> Much appreciate the advice and help!!




More information about the Python-list mailing list