> #!/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.

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  -  Tutor@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

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to