Source code for glideinwms.frontend.stopFrontend
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0
#
# Project:
# glideinWMS
#
# File Version:
#
# Description:
# Stop a running glideinFrontend
#
# Arguments:
# $1 = work_dir
#
# Author:
# Igor Sfiligoi
#
import os
import signal
import sys
import time
from glideinwms.frontend import glideinFrontendConfig, glideinFrontendPidLib
# this one should never throw an exeption
[docs]
def get_element_pids(work_dir, frontend_pid):
# get element pids
frontendDescript = glideinFrontendConfig.FrontendDescript(work_dir)
groups = sorted(frontendDescript.data["Groups"].split(","))
element_pids = {}
for group in groups:
try:
element_pid, element_ppid = glideinFrontendPidLib.get_element_pid(work_dir, group)
except RuntimeError as e:
print(e)
continue # report error and go to next group
if element_ppid != frontend_pid:
print(f"Group '{group}' has an unexpected Parent PID: {element_ppid}!={frontend_pid}")
continue # report error and go to next group
element_pids[group] = element_pid
return element_pids
[docs]
def main(work_dir, force=False):
retries_count = 50
sleep_in_retries = 0.6
# get the pids
try:
frontend_pid = glideinFrontendPidLib.get_frontend_pid(work_dir)
except RuntimeError as e:
print(e)
if str(e) == "Frontend not running":
# Workaround to distinguish when the frontend is not running
# string must be the same as in glideinFrontendPidLib
return 2
return 1
# print frontend_pid
if not glideinFrontendPidLib.pidSupport.check_pid(frontend_pid):
# Frontend already dead
return 0
# kill processes
# first soft kill the frontend (30s timeout, retries_count*sleep_in_retries )
try:
os.kill(frontend_pid, signal.SIGTERM)
except OSError:
pass # frontend likely already dead
for retries in range(retries_count):
if glideinFrontendPidLib.pidSupport.check_pid(frontend_pid):
time.sleep(sleep_in_retries)
else:
return 0 # frontend dead
if not force:
print("Frontend did not die after the timeout of %s sec" % (retries_count * sleep_in_retries))
return 1
# Retry soft kill the frontend ... should exit now
print("Frontend still alive ... retrying soft kill")
try:
os.kill(frontend_pid, signal.SIGTERM)
except OSError:
pass # frontend likely already dead
for retries in range(retries_count):
if glideinFrontendPidLib.pidSupport.check_pid(frontend_pid):
time.sleep(sleep_in_retries)
else:
return 0 # frontend dead
print("Frontend still alive ... sending hard kill")
element_pids = get_element_pids(work_dir, frontend_pid)
# print element_pids
element_keys = sorted(element_pids.keys())
for element in element_keys:
if glideinFrontendPidLib.pidSupport.check_pid(element_pids[element]):
print("Hard killing element %s" % element)
try:
os.kill(element_pids[element], signal.SIGKILL)
except OSError:
pass # ignore already dead processes
if not glideinFrontendPidLib.pidSupport.check_pid(frontend_pid):
return 0 # Frontend died
try:
os.kill(frontend_pid, signal.SIGKILL)
except OSError:
pass # ignore problems
return 0
USAGE_STRING = """Usage: stopFrontend [-f|force] work_dir
return values: 0 Frontend stopped,
1 unable to stop Frontend or wrong invocation, 2 Frontend was not running
"""
if __name__ == "__main__":
if len(sys.argv) < 2:
print(USAGE_STRING)
sys.exit(1)
if len(sys.argv) > 2:
if sys.argv[1] == "-force" or sys.argv[1] == "-f":
sys.exit(main(sys.argv[2], force=True))
else:
print(USAGE_STRING)
sys.exit(1)
else:
# sys.exit(main(sys.argv[1]))
# force should be false but keeping old behavior, always forced stop
sys.exit(main(sys.argv[1], force=True))