coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

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

109 lines
3.8 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 : py_pstree.py is utility to kill process
#############################################################################
try:
import subprocess
import codecs
import psutil
import sys
import argparse
except ImportError as e:
sys.exit("[GAUSS-52200] : Unable to import module: %s." % str(e))
VERSION = '1.0.0'
def command_pstree_parse():
"""
Parse command line
"""
parser = argparse.ArgumentParser(description='This script for get list of process.')
parser.add_argument('-p', '--parents', dest='cpid', required=False,
help="Obtain the pid list of parents of given pid")
parser.add_argument('-c', '--children', dest='ppid', required=False,
help="Obtain the children's pid list of given pid")
parser.add_argument('-s', '--self', dest='include_self', required=False,
help='The selection of including the given pid')
return parser
def parse_args():
"""
Parse args
"""
parser = command_pstree_parse()
opt = parser.parse_args()
if not (opt.ppid or opt.cpid):
parser.error('Pid not specified.')
if (opt.ppid and not opt.ppid.isdigit()) or (opt.cpid and not opt.cpid.isdigit()):
parser.error('Pid format is incorrect.')
return opt
def getPidList(opt):
"""
Get all pid use ps command
"""
if opt.cpid:
# Obtain the pid list of parents of given pid
ppid_list = []
try:
p = psutil.Process(int(opt.cpid))
except (psutil.NoSuchProcess, AttributeError, FileNotFoundError) as _:
(status, output) = subprocess.getstatusoutput("ps ux | grep '%s' | "
"grep -v grep | "
"grep -v py_pstree" % opt.cpid)
if status != 0 or not str(output).strip():
return ppid_list
for ppidInfo in p.parents():
ppid_list.append(ppidInfo.pid)
ppid_list.sort()
return ppid_list
if opt.ppid:
# Obtain the children's pid list of given pid
cpid_list = []
try:
p = psutil.Process(int(opt.ppid))
except (psutil.NoSuchProcess, AttributeError, FileNotFoundError) as _:
(status, output) = subprocess.getstatusoutput("ps ux | grep '%s' | "
"grep -v grep | "
"grep -v py_pstree" % opt.ppid)
if status != 0 or not str(output).strip():
return cpid_list
for cpidInfo in p.threads():
if cpidInfo.id == int(opt.ppid):
continue
cpid_list.append(cpidInfo.id)
cpid_list.sort()
if opt.include_self:
cpid_list.insert(0, int(opt.ppid))
return cpid_list
if __name__ == "__main__":
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
opts = parse_args()
pid_list = getPidList(opts)
for pid in pid_list:
print(pid)