Files
openGauss-OM/script/killall
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

168 lines
6.0 KiB
Python

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
#############################################################################
# Copyright (c) 2020 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under Mulan PSL v2.
# You can use this software according to the terms
# and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
# http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# ----------------------------------------------------------------------------
# Description : killall is a program for kill process.
#############################################################################
"""
"""
import sys
import os
import pwd
import subprocess
import optparse
from gspylib.common.GaussLog import GaussLog
from base_utils.os.env_util import EnvUtil
class Closelogger():
def __init__(self):
pass
def printMessage(self, msg):
sys.stdout.write("%s\n" % msg)
def debug(self, msg):
pass
def init_logger():
global logger
LOG_DEBUG = 1
log_path = EnvUtil.getEnv("GAUSSLOG")
static_config_file = os.path.realpath("%s/bin/cluster_static_config")\
% EnvUtil.getEnv("GAUSSHOME")
if not os.path.exists(str(log_path)) or \
not os.path.exists(str(static_config_file)):
logger = Closelogger()
else:
logFile = os.path.realpath("%s/om/%s" % (log_path, "killall_log.log"))
logger = GaussLog(logFile, "killall", LOG_DEBUG)
def parse_command():
"""parser command"""
parser = optparse.OptionParser(conflict_handler='resolve')
parser.disable_interspersed_args()
parser.add_option('-s', dest='signal', help='Sends a specified signal.')
parser.add_option('-u', dest='user', help='Specified user')
return parser
def exec_kill_process(user="", signal="", processname=""):
"""execute command"""
logger.debug("start to kill process %s" % processname)
if signal == "":
signal = 15
if user:
user_uid = pwd.getpwnam("%s" % user).pw_gid
cmd = "ps -eo uid,pid,comm | awk '{if ($1==\"%s\")print}' | awk" \
" '{if ($3==\"%s\")print}'" % (user_uid, processname)
else:
cmd = "ps -eo uid,pid,comm | awk '{if ($3==\"%s\")print}'" \
% processname
(status, output) = subprocess.getstatusoutput(cmd)
if status != 0:
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
if output:
result_list = output.strip().split('\n')
else:
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
for result in result_list:
result = [i.strip() for i in result.strip().split(" ") if i]
if result[2].strip() == processname:
cmd = "kill -%s %s" % (signal, result[1])
(status, output) = subprocess.getstatusoutput(cmd)
if status != 0:
cmd = "ps -eo pid | awk \'{print $1}\' | grep %s" % result[1]
(status, output) = subprocess.getstatusoutput(cmd)
if status == 0 and output:
logger.debug("Error: %s(%s): Operation not permitted"
% (processname, result[1]))
logger.printMessage("%s(%s): Operation not permitted"
% (processname, result[1]))
else:
logger.debug("Error: %s: no process found" % processname)
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
logger.debug("kill process %s success" % processname)
sys.exit(0)
def check_signal_value(signal, user, processname):
signal_list = [i for i in range(1, 65)]
if int(signal) not in signal_list:
if user:
user_uid = pwd.getpwnam("%s" % user).pw_gid
cmd = "ps -eo uid,pid,comm | awk '{if ($1==\"%s\")print}' | awk " \
"'{if ($3==\"%s\")print}'" % (user_uid, processname)
else:
cmd = "ps -eo uid,pid,comm | awk '{if ($3==\"%s\")print}'"\
% processname
(status, output) = subprocess.getstatusoutput(cmd)
# The query result does not exist, and the status is 1
if status != 0:
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
if output:
result_list = output.strip().split('\n')
else:
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
for result in result_list:
result = [i.strip() for i in result.strip().split(" ") if i]
if result[2].strip() == processname:
logger.debug("Error: %s(%s): Invalid argument"
% (processname, result[1]))
logger.printMessage("%s(%s): Invalid argument"
% (processname, result[1]))
logger.printMessage("%s: no process found" % processname)
sys.exit(1)
else:
return int(signal)
if __name__ == '__main__':
"""main"""
init_logger()
signal_type = ""
for value in sys.argv[1:]:
if value.strip().startswith("-") and value.count("-") == 1 and \
value.strip().split("-")[1].isdigit():
signal_type = value.strip().split("-")[1]
sys.argv.remove(value)
break
parser = parse_command()
opts, args = parser.parse_args()
signal = ""
user = ""
process = ""
if opts.user:
user = opts.user.strip()
if args:
process = args[0]
if opts.signal:
signal = opts.signal.strip()
elif signal_type:
signal_type = check_signal_value(signal_type, user, process)
signal = signal_type
exec_kill_process(user=user, signal=signal, processname=process)