python subprocessモジュールはサブプロセスを監視する2つの方法で、サブプロセスのタイムアウト時間を同時に設定し、すぐに戻る.


一:サイクルビジー等サブプロセス終了
 
import subprocess
import os
import time
tt = '555'
cmd = "python /home/100003/python/mypython/sub2.py "+" 333"+" 444 "+tt
print time.time()
sub2 = subprocess.Popen(cmd, shell=True)
while 1:
    ret1 = subprocess.Popen.poll(sub2)
    if ret1 == 0:
        print sub2.pid,'end'
        break
    elif ret1 is None:
        print  'running'
        time.sleep(1)
    else:
        print sub2.pid,'term'
        break
print time.time()

 
二:サブプロセスが終了したらすぐにselectモジュールを使用してサブプロセスのタイムアウト時間を設定する
 
import subprocess
import select
import time
import signal
import os

tt = '555'
cmd = "python /home/100003/python/mypython/sub2.py "+" 333"+" 444 "+tt
timeout = 3
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,shell = True)
print time.time()
while 1:
    while_begin = time.time()
    print 'timeout',timeout
    fs = select.select([pro.stdout], [], [], timeout)
    if pro.stdout in fs[0]:
        tmp = pro.stdout.read()
        print 'read', tmp
        if not tmp:
            print 'end'
            print time.time()
            break
    else:
        print 'outoftime'
        print os.kill(pro.pid, signal.SIGKILL),
        break
    timeout = timeout - (time.time() - while_begin)