Josh P
Josh P

Reputation: 366

Detect hanging python shell in OS X

I've got a program that implements a buggy library that occasionally hangs due to improperly implementing parallisation.

I don't have the time to fix the core issue, so I'm looking for a hack to figure out when the process is hanging and not doing it's job.

Are there any OS X or python specific APIs to do this? Is it possible to use another thread or even the main thread to repeatedly parse stdout so that when the last few lines haven't changed in a certain duration, the other thread is notified and can kill the misbehaving thread? (and then restart?

Upvotes: 1

Views: 355

Answers (1)

squid314
squid314

Reputation: 1395

Basically you are looking for a monitor process. It will run a command (or set of commands) and watch their execution looking for specific things (in your case, silence on stdout). Referencing the 2 SO questions below (and a brief look at some docs), you can quickly build a super simple monitor.

https://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line https://stackoverflow.com/questions/3471461/raw-input-and-timeout

# monitor.py
import subprocess

TIMEOUT = 10
while True:
  # start a new process to monitor
  # you could also run sys.argv[1:] for a more generic monitor
  child = subprocess.Popen(['python','other.py','arg'], stdout=subprocess.PIPE)
  while True:
    rlist,_,_ = select([child.stdout], [], [], TIMEOUT)
    if rlist:
      child.stdout.read() # do you need to save the output?
    else:
      # timeout occurred, did the process finish?
      if child.poll() is not None:
        # child process completed (or was killed, but didn't hang), we are done
        sys.exit()
      else:
        # otherwise, kill the child and start a new one
        child.kill()
        break

Upvotes: 1

Related Questions