code: def run(self):
          '''
          wait for subprocess to terminate and return subprocess' return code.
          If timeout is reached, throw TimedProcTimeoutError
          '''
          def receive():
              if self.with_communicate:
                  self.stdout, self.stderr = self.process.communicate(input=self.stdin)
              elif self.wait:
                  self.process.wait()
  
          if not self.timeout:
              receive()
          else:
              rt = threading.Thread(target=receive)
              rt.start()
              rt.join(self.timeout)
              if rt.isAlive():
                  # Subprocess cleanup (best effort)
                  self.process.kill()
  
                  def terminate():
                      if rt.isAlive():
                          self.process.terminate()
                  threading.Timer(10, terminate).start()
                  raise salt.exceptions.TimedProcTimeoutError(
                      '{0} : Timed out after {1} seconds'.format(
                          self.command,
                          six.text_type(self.timeout),
                      )
                  )
          return self.process.returncodf run(self):
          '''
          wait for subprocess to terminate and return subprocess' return code.
          If timeout is reached, throw TimedProcTimeoutError
          '''
          def receive():
              if self.with_communicate:
                  self.stdout, self.stderr = self.process.communicate(input=self.stdin)
              elif self.wait:
                  self.process.wait()
  
          if not self.timeout:
              receive()
          else:
              rt = threading.Thread(target=receive)
              rt.start()
              rt.join(self.timeout)
              if rt.isAlive():
                  # Subprocess cleanup (best effort)
                  self.process.kill()
  
                  def terminate():
                      if rt.isAlive():
                          self.process.terminate()
                  threading.Timer(10, terminate).start()
                  raise salt.exceptions.TimedProcTimeoutError(
                      '{0} : Timed out after {1} seconds'.format(
                          self.command,
                          six.text_type(self.timeout),
                      )
                  )
          return self.process.returncode
docs: wait for subprocess to terminate and return subprocess' return code.
          If timeout is reached, throw TimedProcTimeoutError