mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-26 15:40:21 +00:00
In case if it was interrupted by SIGCHLD but scheduled awake time is not reached it will continue sleeping. For all other signals behaviuor is not changed.
41 lines
901 B
Python
41 lines
901 B
Python
import os
|
|
import signal
|
|
import sys
|
|
import time
|
|
|
|
received_sigchld = False
|
|
|
|
|
|
def sigterm_handler(signo, stack_frame):
|
|
sys.exit()
|
|
|
|
|
|
def sigchld_handler(signo, stack_frame):
|
|
global received_sigchld
|
|
received_sigchld = True
|
|
try:
|
|
while True:
|
|
ret = os.waitpid(-1, os.WNOHANG)
|
|
if ret == (0, 0):
|
|
break
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
def sleep(interval):
|
|
global received_sigchld
|
|
current_time = time.time()
|
|
end_time = current_time + interval
|
|
while current_time < end_time:
|
|
received_sigchld = False
|
|
time.sleep(end_time - current_time)
|
|
if not received_sigchld: # we will ignore only sigchld
|
|
break
|
|
current_time = time.time()
|
|
received_sigchld = False
|
|
|
|
|
|
def setup_signal_handlers():
|
|
signal.signal(signal.SIGTERM, sigterm_handler)
|
|
signal.signal(signal.SIGCHLD, sigchld_handler)
|