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