Revision 5ef5ea45
b/lib/utils.py | ||
---|---|---|
566 | 566 |
@return: True if the process exists |
567 | 567 |
|
568 | 568 |
""" |
569 |
def _TryStat(name): |
|
570 |
try: |
|
571 |
os.stat(name) |
|
572 |
return True |
|
573 |
except EnvironmentError, err: |
|
574 |
if err.errno in (errno.ENOENT, errno.ENOTDIR): |
|
575 |
return False |
|
576 |
elif err.errno == errno.EINVAL: |
|
577 |
raise RetryAgain(err) |
|
578 |
raise |
|
579 |
|
|
580 |
assert isinstance(pid, int), "pid must be an integer" |
|
569 | 581 |
if pid <= 0: |
570 | 582 |
return False |
571 | 583 |
|
584 |
proc_entry = "/proc/%d/status" % pid |
|
585 |
# /proc in a multiprocessor environment can have strange behaviors. |
|
586 |
# Retry the os.stat a few times until we get a good result. |
|
572 | 587 |
try: |
573 |
os.stat("/proc/%d/status" % pid) |
|
574 |
return True |
|
575 |
except EnvironmentError, err: |
|
576 |
if err.errno in (errno.ENOENT, errno.ENOTDIR): |
|
577 |
return False |
|
578 |
raise |
|
588 |
return Retry(_TryStat, (0.01, 1.5, 0.1), 0.5, args=[proc_entry]) |
|
589 |
except RetryTimeout, err: |
|
590 |
err.RaiseInner() |
|
579 | 591 |
|
580 | 592 |
|
581 | 593 |
def ReadPidFile(pidfile): |
Also available in: Unified diff