Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python2
- from threading import Thread
- import json, os, signal, subprocess, time
- class ThreadPopen(Thread):
- def __init__(self, cmd, timeout = 60):
- self.key = str(cmd[0])
- Thread.__init__(self, name=self.key)
- self.cmd = cmd
- self.timeout = timeout
- self.t0 = None
- self.result = None
- def __getitem__(self, key):
- try:
- return self.__dict__[key]
- except KeyError as e:
- raise AttributeError()
- def run_popen(self):
- process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- while process.poll() is None:
- time.sleep(0.1)
- if time.time() - self.t0 > self.timeout:
- os.kill(process.pid, signal.SIGKILL)
- os.waitpid(-1, os.WNOHANG)
- self.result = (None, None)
- break
- if process.poll() is not None:
- _stdout, _stderr = process.communicate()
- self.result = (_stdout, _stderr)
- def run(self):
- self.t0 = time.time()
- try:
- self.run_popen()
- except:
- print "Failed to call self.run_popen() for " + self.cmd
- def main():
- cmd_ls = []
- proc_ls = []
- res_ls = []
- for cmd in cmd_ls:
- try:
- proc = ThreadPopen(cmd)
- proc_ls.append(proc)
- proc_ls[-1].start()
- except:
- print "Failed to init or start ThreadPopen() for " + cmd
- for proc in proc_ls:
- proc.join()
- for proc in proc_ls:
- res_ls.append(proc.result)
- print res_ls
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement