On Sun, Dec 19, 2010 at 8:29 PM, Evert Rol <evert....@gmail.com> wrote: >>>>>> #!/usr/bin/env python >>>>>> import datetime >>>>>> import subprocess >>>>>> import sys >>>>>> import os >>>>>> import signal >>>>>> from time import sleep >>>>>> >>>>>> def host_run(cmd, secs=10): >>>>>> print("running %s" % cmd) >>>>>> timeout = datetime.timedelta(seconds=secs) >>>>>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, >>>>>> stderr=subprocess.STDOUT, shell=True) >>>>>> start = datetime.datetime.now() >>>>>> while ( proc.poll() is None and (datetime.datetime.now() - start) >>>>>> < timeout): #not timed out >>>>>> print proc.stdout.readline() #TODO timestamp? >>>>>> print "hello,i'm here" >>>>>> sleep(1) >>>>>> if 0 == proc.poll(): >>>>>> print("'%s' is program exited" %cmd) >>>>>> else: >>>>>> try: >>>>>> os.kill(proc.pid, signal.SIGINT) >>>>>> print "Process timeout: '%s'" % cmd >>>>>> except OSError: >>>>>> pass >>>>>> #cmd="ping 128.114.122.2" >>>>>> cmd="ssh r...@10.0.0.1" >>>>>> host_run(cmd,10) >>>>>> >>>>>> if cmd="ssh r...@10.0.0.1" >>>>>> it never print "hello i'm here" , how can i handle this issue, and I >>>>>> find my script cant process the "timeout" to kill it. >>>>>> if cmd="ping 128.114.122.2", no this issue. >>>>> >>>>> Have you tried running these two commands from the command line? >>>>> Spot the difference: ssh is waiting for input (a password. And if >>>>> passwordless, it may still not produce output to stdout), while ping just >>>>> continues to produce output. >>>>> Then look at the line >>>>> print proc.stdout.readline() >>>>> Will that ever read a full line for the ssh command? Probably not, while >>>>> for ping it will. >>>>> >>>> >>>> it's a test, actually, I can't access 10.0.0.1, i just want to kill it >>>> if *no responding" in 10 second, but it doesn't kill it. I don't know >>>> why. >>>> my script is to run a cmd, if more than 10 sec, kill it >>>> can you show me where is wrong, thanks in advance >>> >>> But you never said where the script gets stuck. That would be a very >>> important first step for debugging. >>> >>> And if I run this script, I get the following: >>> " >>> $> python bla.py >>> running ssh r...@10.0.0.1 >>> ssh: connect to host 10.0.0.1 port 22: Connection refused >>> >>> hello,i'm here >>> " >>> So seems to work for me. >>> thus, what is the result of >>> $> ssh r...@10.0.0.1 >>> for you? >>> >> >> [lya...@pek-lpgbuild13 py]$ ssh r...@10.0.0.1 >> ssh: connect to host 10.0.0.1 port 22: Connection timed out >> >> but it will wait for above 30 seconds then print "ssh: connect to host >> 10.0.0.1 port 22: Connection timed out", but my script is designed to >> kill it if cmd running more than 10 secs. > > So it doesn't produce output for at least 30 secs. Then my guess that it gets > stuck at the readline() line still stands.
Right, it gets stuck at the readline(), is there a function not get stuck to instead of readline(). Lei > Unfortunately, you still haven't told us where the script gets stuck. > Also, have you tried to let the script run for, say, 30 seconds at least? Ie, > the time it takes for the ssh command to time out by itself. > > Evert > > >> >> >> Lei >> >>> Evert >>> >>> >>>>> So my guess is, your script gets stuck at that line. >>>>> But if you ctrl-C to stop the script, you should see where your program >>>>> gets stuck. You didn't say where it got stuck, that would have helped. >>>>> >>>>> Good luck, >>>>> >>>>> Evert >>>>> >>>>> >>>>>> On Sun, Dec 19, 2010 at 4:57 PM, Alan Gauld <alan.ga...@btinternet.com> >>>>>> wrote: >>>>>>> >>>>>>> "lei yang" <yanglei.f...@gmail.com> wrote >>>>>>> >>>>>>> >>>>>>> def runForAWhile(cmd, secs=10): >>>>>>> print("running %s" % cmd) >>>>>>> timeout = datetime.timedelta(seconds=secs) >>>>>>> print timeout >>>>>>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, >>>>>>> stderr=subprocess.STDOUT, shell=True) >>>>>>> status = proc.poll() >>>>>>> >>>>>>> You are still only checking status once outside the while loop. >>>>>>> >>>>>>> start = datetime.datetime.now() >>>>>>> while (status is None and (datetime.datetime.now() - start) < >>>>>>> timeout): #not timed out >>>>>>> print proc.stdout.readline() #TODO timestamp? >>>>>>> #print status >>>>>>> #print datetime.datetime.now() - start >>>>>>> >>>>>>> >>>>>>>> I see that "status" always "!=0“ why program is NOT exited >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Alan Gauld >>>>>>> Author of the Learn to Program web site >>>>>>> http://www.alan-g.me.uk/ >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Tutor maillist - tu...@python.org >>>>>>> To unsubscribe or change subscription options: >>>>>>> http://mail.python.org/mailman/listinfo/tutor >>>>>>> >>>>>> _______________________________________________ >>>>>> Tutor maillist - tu...@python.org >>>>>> To unsubscribe or change subscription options: >>>>>> http://mail.python.org/mailman/listinfo/tutor >>>>> >>>>> >>> >>> > > _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor