[Kimchi-devel] [PATCH V2] add a synchronous function with timeout to execute command

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Mon Jan 13 13:20:00 UTC 2014


Reviewed-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>

On 01/11/2014 01:11 AM, Sheldon wrote:
> How to test this patch:
>
> 1. run a command with long time.*
> **$ sudo python -c 'import sys;**
> **sys.path.insert(0, "src");**
> **from kimchi import utils;**
> **print utils.run_command([**"dd", "if=/dev/zero", "of=/dev/null"]**, 
> 1.5)'*
>
> subprocess is killed by signal.SIGKILL for timeout 1.5 seconds
> ('', '', -9, True)
>
> 2. run a command failed
> *$ sudo python -c 'import sys;**
> **sys.path.insert(0, "src");**
> **from kimchi import utils;**
> **print utils.run_command(["not-command"])'*
>
> Failed to run command: not-command.
>   [Errno 2] No such file or directory
> (None, None, None, False)
>
>
> 3. run a command with an error optional param
> *$ sudo python -c 'import sys;**
> **sys.path.insert(0, "src");**
> **from kimchi import utils;**
> **print utils.run_command(["ls", "-w"])'*
>
> ('', "ls: option requires an argument -- 'w'\nTry 'ls --help' for more 
> information.\n", 2, False)
>
> 4. run a command successfully
> *$ sudo python -c 'import sys;**
> **sys.path.insert(0, "src");**
> **from kimchi import utils;**
> **print utils.run_command(["echo", "test"])'*
>
> ('test\n', '', 0, False)
>
>
> On 01/10/2014 10:10 PM, shaohef at linux.vnet.ibm.com wrote:
>> From: ShaoHe Feng<shaohef at linux.vnet.ibm.com>
>>
>> We need a common function to execute shell command.
>> We also need timeout when execute shell command.
>>
>> A threading.Timer is used to send signal.SIGKILL to kill the command
>> when timeout.
>>
>> Signed-off-by: Royce Lv<lvroyce at linux.vnet.ibm.com>
>> Signed-off-by: ShaoHe Feng<shaohef at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/utils.py | 43 +++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 43 insertions(+)
>>
>> diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
>> index af245c6..c7165ce 100644
>> --- a/src/kimchi/utils.py
>> +++ b/src/kimchi/utils.py
>> @@ -23,6 +23,7 @@
>>
>>   import cherrypy
>>   import os
>> +import subprocess
>>   import urllib2
>>
>>
>> @@ -30,6 +31,7 @@ from cherrypy.lib.reprconf import Parser
>>
>>
>>   from kimchi import config
>> +from threading import Timer
>>
>>
>>   kimchi_log = cherrypy.log.error_log
>> @@ -96,3 +98,44 @@ def check_url_path(path):
>>           return False
>>
>>       return True
>> +
>> +
>> +def run_command(cmd, timeout=None):
>> +    def kill_proc(proc, timeout_flag):
>> +        timeout_flag[0] = True
>> +        proc.kill()
>> +
>> +    proc = None
>> +    timer = None
>> +    timeout_flag = [False]
>> +
>> +    try:
>> +        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
>> +                                stderr=subprocess.PIPE)
>> +        if timeout is not None:
>> +            timer = Timer(timeout, kill_proc, [proc, timeout_flag])
>> +            timer.start()
>> +
>> +        out, error = proc.communicate()
>> +        kimchi_log.debug("Run command: '%s'", " ".join(cmd))
>> +
>> +        if out or error:
>> +            kimchi_log.debug("out:\n %s\nerror:\n %s", out, error)
>> +
>> +        if proc.returncode == -9 and timeout_flag[0] is True:
>> +            kimchi_log.error("subprocess is killed by signal.SIGKILL "
>> +                             "for timeout %s seconds", timeout)
>> +
>> +        return out, error, proc.returncode, timeout_flag[0]
>> +    except Exception as e:
>> +        msg = "Failed to run command: %s." % " ".join(cmd)
>> +        msg = msg if proc is None else msg + "\n  error code: %s."
>> +        kimchi_log.error("%s\n  %s", msg, e)
>> +
>> +        if proc:
>> +            return out, error, proc.returncode, timeout_flag[0]
>> +        else:
>> +            return None, None, None, timeout_flag[0]
>> +    finally:
>> +        if timer and not timeout_flag[0]:
>> +            timer.cancel()
>
>
> -- 
> Thanks and best regards!
>
> Sheldon Feng(???)<shaohef at linux.vnet.ibm.com>
> IBM Linux Technology Center
>
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20140113/97fc40fb/attachment.html>


More information about the Kimchi-devel mailing list