diff --git a/class/core/mw.py b/class/core/mw.py index 04d8d6186..f5d90dbc9 100755 --- a/class/core/mw.py +++ b/class/core/mw.py @@ -2110,6 +2110,15 @@ def notifyMessage(msg, stype='common', trigger_time=300, is_write_log=True): ##################### notify end ######################################### +def getGlibcVersion(): + try: + cmd_result = execShell("ldd --version")[0] + if not cmd_result: return '' + glibc_version = cmd_result.split("\n")[0].split()[-1] + except: + return '' + return glibc_version + ##################### ssh start ######################################### def getSshDir(): if isAppleSystem(): diff --git a/plugins/task_manager/js/task_manager.js b/plugins/task_manager/js/task_manager.js index 190b00173..8dc9ffa76 100644 --- a/plugins/task_manager/js/task_manager.js +++ b/plugins/task_manager/js/task_manager.js @@ -861,47 +861,53 @@ function userdel(user) { //结束进程 function kill_process(pid, fpid) { if (fpid) { - select_pid = fpid; + select_pid = fpid; } var w = layer.confirm('您是否要结束 (' + pid + ') 进程?', { - btn: ['结束', '取消'], //按钮 - title: '结束' + pid, - closeBtn: 2 + btn: ['结束', '取消'], //按钮 + title: '结束' + pid, + closeBtn: 2 }, function () { - var loadT = layer.msg('正在结束进程[' + pid + ']..', {icon: 16, time: 0, shade: [0.3, '#000']}); - $.post('/plugin?action=a&name=task_manager&s=kill_process', {pid: pid}, function (rdata) { - layer.close(loadT); - layer.msg(rdata.msg, {icon: rdata.status ? 1 : 2}); - if (rdata.status) get_process_list(); - }) + var loadT = layer.msg('正在结束进程[' + pid + ']..', {icon: 16, time: 0, shade: [0.3, '#000']}); + tmPostCallback('kill_process', {pid:pid}, function(data){ + layer.close(loadT); + layer.msg(rdata.msg, {icon: rdata.status ? 1 : 2}); + if (rdata.status) { + get_process_list(); + } + }); }, function () { - layer.close(w) + layer.close(w); }) } //结束进程树 function kill_process_all(pid) { var w = layer.confirm('您是否要结束 (' + pid + ') 进程?', { - btn: ['结束', '取消'], //按钮 - title: '结束' + pid, - closeBtn: 2 + btn: ['结束', '取消'], //按钮 + title: '结束' + pid, + closeBtn: 2 }, function () { - var loadT = layer.msg('正在结束父进程[' + pid + ']..', {icon: 16, time: 0, shade: [0.3, '#000']}); - $.post('/plugin?action=a&name=task_manager&s=kill_process_all', {pid: pid}, function (rdata) { - layer.close(loadT); - layer.msg(rdata.msg, {icon: rdata.status ? 1 : 2}); - if (rdata.status) get_process_list(); - }) + var loadT = layer.msg('正在结束父进程[' + pid + ']..', {icon: 16, time: 0, shade: [0.3, '#000']}); + tmPostCallback('kill_process_all', {pid:pid}, function(data){ + layer.close(loadT); + var rdata = data.data; + showMsg(rdata.msg, function(){ + if (rdata.status) { + get_process_list(); + } + },{icon: rdata.status ? 1 : 2}); + }); }, function () { - layer.close(w) - }) + layer.close(w); + }); } //打开文件所在位置 function open_path(path) { - tmp = path.split('/') + var tmp = path.split('/'); tmp[tmp.length - 1] = ''; - path = '/' + tmp.join('/'); + var path = '/' + tmp.join('/'); openPath(path); } diff --git a/plugins/task_manager/task_manager_index.py b/plugins/task_manager/task_manager_index.py index 896a5e9a7..722feeff2 100755 --- a/plugins/task_manager/task_manager_index.py +++ b/plugins/task_manager/task_manager_index.py @@ -584,6 +584,68 @@ class mainClass(object): except: return [] + # 外部接口,结束进程,pid30以上 + def kill_process(self, get): + pid = int(get['pid']) + if pid < 30: return mw.returnData(False, '不能结束系统关键进程!') + if not pid in psutil.pids(): return mw.returnData(False, '指定进程不存在!') + if not 'killall' in get: + p = psutil.Process(pid) + if self.is_panel_process(pid): return mw.returnData(False, '不能结束面板服务进程') + p.kill() + return mw.returnData(True, '进程已结束') + return self.kill_process_all(pid) + + # 是否为面板进程 + def is_panel_process(self, pid): + if not self.panel_pid: + self.panel_pid = os.getpid() + if pid == self.panel_pid: return True + if not self.task_pid: + try: + self.task_pid = int(mw.execShell("ps aux | grep 'python3 task.py' |grep -v grep|head -n1|awk '{print $2}'")[0]) + except: + self.task_pid = -1 + if pid == self.task_pid: return True + return False + + # 遍历结束pid的子进程 kill_process_all——>引用kill_process_lower + def kill_process_lower(self, pid): + pids = psutil.pids() + for lpid in pids: + if lpid < 30: continue + if self.is_panel_process(lpid): continue + p = psutil.Process(lpid) + ppid = p.ppid() + if ppid == pid: + p.kill() + return self.kill_process_lower(lpid) + return True + + # 结束进程树 kill_process——>引用kill_process_all + def kill_process_all(self, pid): + # public.print_log(pid) + if pid < 30: return mw.returnData(True, '已结束此进程树!') + if self.is_panel_process(pid): return mw.returnData(False, '不能结束面板服务进程') + try: + if not pid in psutil.pids(): mw.returnData(True, '已结束此进程树!') + p = psutil.Process(pid) + ppid = p.ppid() + name = p.name() + p.kill() + mw.execShell('pkill -9 ' + name) + if name.find('php-') != -1: + mw.execShell("rm -f /tmp/php-cgi-*.sock") + elif name.find('mysql') != -1: + mw.execShell("rm -f /tmp/mysql.sock") + elif name.find('nginx') != -1: + mw.execShell("rm -f /tmp/mysql.sock") + self.kill_process_lower(pid) + if ppid: return self.kill_process_all(ppid) + except: + pass + return public.returnMsg(True, '已结束此进程树!') + def get_process_list(self, args = {}): # https://hellowac.github.io/psutil-doc-zh/processes/process_class/oneshot.html if self.is_mac: @@ -724,7 +786,7 @@ class mainClass(object): res = True if get['sortx'] == 'status': res = False - + if 'reverse' in get: if get['reverse'] in ['undefined', 'null']: get['reverse'] = 'True' @@ -1285,6 +1347,16 @@ def get_network_list(args = {}): def get_process_list(args = {}): return mc_instance.get_process_list(args) +def kill_process(args = {}): + return mc_instance.kill_process(args) + +def kill_process_all(args = {}): + if not 'pid' in args: + return mw.returnData(False, '缺少参数!') + return mc_instance.kill_process_all(int(args['pid'])) + + + def get_service_list(args = {}): return mc_instance.get_service_list(args)