[Tutor] why "ifconfig" is alway running?
lei yang
yanglei.fage at gmail.com
Sun Dec 19 13:43:42 CET 2010
On Sun, Dec 19, 2010 at 8:29 PM, Evert Rol <evert.rol at 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 root at 10.0.0.1"
>>>>>> host_run(cmd,10)
>>>>>>
>>>>>> if cmd="ssh root at 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 root at 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 root at 10.0.0.1
>>> for you?
>>>
>>
>> [lyang0 at pek-lpgbuild13 py]$ ssh root at 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.gauld at btinternet.com> wrote:
>>>>>>>
>>>>>>> "lei yang" <yanglei.fage at 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 at python.org
>>>>>>> To unsubscribe or change subscription options:
>>>>>>> http://mail.python.org/mailman/listinfo/tutor
>>>>>>>
>>>>>> _______________________________________________
>>>>>> Tutor maillist - Tutor at python.org
>>>>>> To unsubscribe or change subscription options:
>>>>>> http://mail.python.org/mailman/listinfo/tutor
>>>>>
>>>>>
>>>
>>>
>
>
More information about the Tutor
mailing list