in github-runner-ami/packer/files/runner-supervisor.py [0:0]
def check_still_alive(self):
# Check ASG status
if not self.in_termating_lifecycle:
state = get_lifecycle_state()
if state == 'Terminating:Wait':
self.in_termating_lifecycle = True
self.gracefully_terminate_runner()
elif state == 'Pending:Wait':
complete_asg_lifecycle_hook()
# proc_connector is un-reliable (UDP) so periodically check if the processes are still alive
if not self.interesting_processes:
self.pgrep()
return
# list() is used to prevent "Dict changed size during iteration" during loop below
pids = list(self.interesting_processes.keys())
log.info("Checking processes %r are still alive", pids)
for pid in pids:
proc = self.interesting_processes[pid]
if not proc.is_running() or proc.status() == psutil.STATUS_ZOMBIE:
log.info("Proc %d dead but we didn't notice!", pid)
del self.interesting_processes[pid]
if not self.interesting_processes:
log.info("No interesting processes left, unprotecting from scale in")
self.protect_from_scale_in(protect=False)
elif not self.protected:
# If we didn't manage to protect last time, try again
self.protect_from_scale_in()