168 lines
6.0 KiB
Python
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)
|