diff --git a/class/core/btkill.py b/class/core/btkill.py
new file mode 100755
index 000000000..14eee5a65
--- /dev/null
+++ b/class/core/btkill.py
@@ -0,0 +1,80 @@
+# coding: utf-8
+
+# 使用示例:
+# 1、将此文件重命名为btkill.py , 然后上传到服务器/root目录
+# 2、执行 python /root/btkill.py
+
+import psutil
+import time
+import os
+
+
+class btkill:
+ __limit = 10 # Cpu使用率触发上限
+ __vmsize = 1048576 / 4 # 虚拟内存触发上限(字节)
+
+ def checkMain(self):
+ pids = psutil.pids()
+ num = 0
+ for pid in pids:
+ try:
+ p = psutil.Process(pid)
+ if p.exe() == "":
+ continue
+ name = p.name()
+ if self.whiteList(name):
+ continue
+ cputimes = p.cpu_times()
+ if cputimes.user < 0.1:
+ continue
+ percent = p.cpu_percent(interval=0.1)
+ vm = p.memory_info().vms
+ if percent > self.__limit or vm > self.__vmsize:
+ log = time.strftime('%Y-%m-%d %X', time.localtime()) + " (PID=" + str(
+ pid) + ", NAME=" + name + ", VMS=" + str(vm) + ", PERCENT=" + str(percent) + "%)"
+ p.kill()
+ num += 1
+ print log + " >> killed\n"
+ except Exception as ex:
+ print str(ex)
+ return num
+
+ # 检查白名单
+ def whiteList(self, name):
+ wlist = ['yum', 'apt-get', 'apt', 'redis-cli', 'memcached', 'sshd', 'vm', 'vim', 'htop', 'top', 'sh', 'bash', 'zip', 'gzip', 'rsync',
+ 'tar', 'unzip', 'php', 'composer', 'pkill', 'mongo', 'mongod', 'php-fpm', 'nginx', 'httpd', 'lsof', 'ps', 'redis-server',
+ 'mysqld', 'mysqld_safe', 'mysql', 'pure-ftpd', 'sparse_dd', 'stunnel', 'squeezed', 'vncterm', 'awk', 'ruby', 'postgres',
+ 'mpathalert', 'vncterm', 'multipathd', 'fe', 'elasticsyslog', 'syslogd', 'v6d', 'xapi', 'screen', 'runsvdir', 'svlogd',
+ 'java', 'udevd', 'ntpd', 'irqbalance', 'qmgr', 'wpa_supplicant', 'mysqld_safe', 'sftp-server', 'lvmetad', 'gitlab-web',
+ 'pure-ftpd', 'auditd', 'master', 'dbus-daemon', 'tapdisk', 'sshd', 'init', 'ksoftirqd', 'kworker', 'kmpathd',
+ 'kmpath_handlerd', 'python', 'kdmflush', 'bioset', 'crond', 'kthreadd', 'migration', 'rcu_sched', 'kjournald',
+ 'gcc', 'gcc++', 'nginx', 'mysqld', 'php-cgi', 'login', 'firewalld', 'iptables', 'systemd', 'network', 'dhclient',
+ 'systemd-journald', 'NetworkManager', 'systemd-logind', 'systemd-udevd', 'polkitd', 'tuned', 'rsyslogd', 'AliYunDunUpdate', 'AliYunDun', 'sendmail']
+ wslist = ['vif', 'qemu', 'scsi_eh', 'xcp',
+ 'xen', 'docker', 'yunsuo', 'aliyun', 'PM2']
+
+ for key in wlist:
+ if key == name:
+ return True
+
+ for key in wslist:
+ if name.find(key) != -1:
+ return True
+
+ return False
+
+ # 开始处理
+ def start(self):
+ num = 0
+ while True:
+ num += self.checkMain()
+ time.sleep(3)
+ print '======================================='
+ print "查杀完成, 共查杀[" + str(num) + "]个异常进程!"
+
+
+if __name__ == "__main__":
+ print "正在检测异常进程..."
+ print '======================================='
+ c = btkill()
+ c.start()
diff --git a/class/core/system_api.py b/class/core/system_api.py
index 845c18517..0aac8d8d7 100755
--- a/class/core/system_api.py
+++ b/class/core/system_api.py
@@ -180,6 +180,24 @@ class system_api:
memInfo['memCached']
return memInfo
+ def getMemUsed(self):
+ # 取内存使用率
+ try:
+ import psutil
+ mem = psutil.virtual_memory()
+
+ if public.getOs() == 'darwin':
+ return mem.percent
+
+ memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024,
+ 'memBuffers': mem.buffers / 1024 / 1024, 'memCached': mem.cached / 1024 / 1024}
+ tmp = memInfo['memTotal'] - memInfo['memFree'] - \
+ memInfo['memBuffers'] - memInfo['memCached']
+ tmp1 = memInfo['memTotal'] / 100
+ return (tmp / tmp1)
+ except Exception, ex:
+ return 1
+
def getDiskInfo(self, get=None):
return self.getDiskInfo2()
# 取磁盘分区信息
diff --git a/task.py b/task.py
index 1593ca6ac..293fdb736 100755
--- a/task.py
+++ b/task.py
@@ -8,6 +8,7 @@ import os
import json
import time
print sys.path
+
sys.path.append("/usr/local/lib/python2.7/site-packages")
import psutil
@@ -16,7 +17,6 @@ reload(sys)
sys.setdefaultencoding('utf-8')
import db
import public
-import time
global pre, timeoutCount, logPath, isTask, oldEdate, isCheck
@@ -28,13 +28,13 @@ oldEdate = None
logPath = os.getcwd() + '/tmp/panelExec.log'
isTask = os.getcwd() + '/tmp/panelTask.pl'
-if ~os.path.exists(os.getcwd() + "/tmp"):
+if not os.path.exists(os.getcwd() + "/tmp"):
os.system('mkdir -p ' + os.getcwd() + "/tmp")
-if ~os.path.exists(logPath):
+if not os.path.exists(logPath):
os.system("touch " + logPath)
-if ~os.path.exists(isTask):
+if not os.path.exists(isTask):
os.system("touch " + isTask)
@@ -234,11 +234,11 @@ def systemTask():
tmp['used'] = psutil.cpu_percent(interval=1)
if not cpuInfo:
- tmp['mem'] = getMemUsed()
+ tmp['mem'] = sm.getMemUsed()
cpuInfo = tmp
if cpuInfo['used'] < tmp['used']:
- tmp['mem'] = getMemUsed()
+ tmp['mem'] = sm.getMemUsed()
cpuInfo = tmp
# 取当前网络Io
@@ -314,7 +314,7 @@ def systemTask():
"addtime", (deltime,)).delete()
# LoadAverage
- load_average = getLoadAverage()
+ load_average = sm.getLoadAverage()
lpro = round(
(load_average['one'] / load_average['max']) * 100, 2)
if lpro > 100:
@@ -339,7 +339,7 @@ def systemTask():
print str(ex)
del(tmp)
- time.sleep(1)
+ # time.sleep(1)
count += 1
except Exception, ex:
print str(ex)
@@ -348,167 +348,8 @@ def systemTask():
systemTask()
-def getMemUsed():
- # 取内存使用率
- try:
- import psutil
- mem = psutil.virtual_memory()
- print 'mem:', mem
- memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024,
- 'memBuffers': mem.buffers / 1024 / 1024, 'memCached': mem.cached / 1024 / 1024}
- tmp = memInfo['memTotal'] - memInfo['memFree'] - \
- memInfo['memBuffers'] - memInfo['memCached']
- tmp1 = memInfo['memTotal'] / 100
- return (tmp / tmp1)
- except:
- return 1
-
-
-def getLoadAverage():
- import psutil
- c = os.getloadavg()
- data = {}
- data['one'] = float(c[0])
- data['five'] = float(c[1])
- data['fifteen'] = float(c[2])
- data['max'] = psutil.cpu_count() * 2
- data['limit'] = data['max']
- data['safe'] = data['max'] * 0.75
- return data
-
-
-def check502():
- # 检查502错误
- try:
- phpversions = ['53', '54', '55', '56', '70', '71', '72']
- for version in phpversions:
- if not os.path.exists('/etc/init.d/php-fpm-' + version):
- continue
- if checkPHPVersion(version):
- continue
- if startPHPVersion(version):
- public.WriteLog('PHP守护程序', '检测到PHP-' + version + '处理异常,已自动修复!')
- except:
- pass
-
-
-def startPHPVersion(version):
- # 处理指定PHP版本
- try:
- fpm = '/etc/init.d/php-fpm-' + version
- if not os.path.exists(fpm):
- return False
-
- # 尝试重载服务
- os.system(fpm + ' reload')
- if checkPHPVersion(version):
- return True
-
- # 尝试重启服务
- cgi = '/tmp/php-cgi-' + version
- pid = '/www/server/php' + version + '/php-fpm.pid'
- os.system('pkill -9 php-fpm-' + version)
- time.sleep(0.5)
- if not os.path.exists(cgi):
- os.system('rm -f ' + cgi)
- if not os.path.exists(pid):
- os.system('rm -f ' + pid)
- os.system(fpm + ' start')
- if checkPHPVersion(version):
- return True
-
- # 检查是否正确启动
- if os.path.exists(cgi):
- return True
- except:
- return True
-
-
-def checkPHPVersion(version):
- # 检查指定PHP版本
- try:
- url = 'http://127.0.0.1/phpfpm_' + version + '_status'
- result = public.httpGet(url)
- # 检查nginx
- if result.find('Bad Gateway') != -1:
- return False
- # 检查Apache
- if result.find('Service Unavailable') != -1:
- return False
- if result.find('Not Found') != -1:
- CheckPHPINFO()
-
- # 检查Web服务是否启动
- if result.find('Connection refused') != -1:
- global isTask
- if os.path.exists(isTask):
- isStatus = public.readFile(isTask)
- if isStatus == 'True':
- return True
- filename = '/etc/init.d/nginx'
- if os.path.exists(filename):
- os.system(filename + ' start')
- filename = '/etc/init.d/httpd'
- if os.path.exists(filename):
- os.system(filename + ' start')
-
- return True
- except:
- return True
-
-
-def CheckPHPINFO():
- # 检测PHPINFO配置
- php_versions = ['53', '54', '55', '56', '70', '71', '72']
- setupPath = '/www/server'
- path = setupPath + '/panel/vhost/nginx/phpinfo.conf'
- if not os.path.exists(path):
- opt = ""
- for version in php_versions:
- opt += "\n\tlocation /" + version + \
- " {\n\t\tinclude enable-php-" + version + ".conf;\n\t}"
-
- phpinfoBody = '''server
-{
- listen 80;
- server_name 127.0.0.2;
- allow 127.0.0.1;
- index phpinfo.php index.html index.php;
- root /www/server/phpinfo;
-%s
-}''' % (opt,)
- public.writeFile(path, phpinfoBody)
-
- path = setupPath + '/panel/vhost/apache/phpinfo.conf'
- if not os.path.exists(path):
- opt = ""
- for version in php_versions:
- opt += """\n
- SetHandler "proxy:unix:/tmp/php-cgi-%s.sock|fcgi://localhost"
-""" % (version, version)
-
- phpinfoBody = '''
-
-DocumentRoot "/www/server/phpinfo"
-ServerAdmin phpinfo
-ServerName 127.0.0.2
-%s
-
- SetOutputFilter DEFLATE
- Options FollowSymLinks
- AllowOverride All
- Order allow,deny
- Allow from all
- DirectoryIndex index.php index.html index.htm default.php default.html default.htm
-
-
-''' % (opt,)
- public.writeFile(path, phpinfoBody)
-
-# 502错误检查线程
-
-
def check502Task():
+ # 502错误检查线程
try:
while True:
if os.path.exists('/www/server/panel/data/502Task.pl'):
@@ -518,28 +359,14 @@ def check502Task():
time.sleep(600)
check502Task()
-# 自动结束异常进程
-
def btkill():
+ # 自动结束异常进程
import btkill
b = btkill.btkill()
b.start()
if __name__ == "__main__":
- # os.system('rm -rf /www/server/phpinfo/*')
- # if os.path.exists('/www/server/nginx/sbin/nginx'):
- # pfile = '/www/server/nginx/conf/enable-php-72.conf'
- # if not os.path.exists(pfile):
- # pconf = '''location ~ [^/]\.php(/|$)
- # {
- # try_files $uri =404;
- # fastcgi_pass unix:/tmp/php-cgi-72.sock;
- # fastcgi_index index.php;
- # include fastcgi.conf;
- # include pathinfo.conf;
- # }'''
- # public.writeFile(pfile, pconf)
import threading
t = threading.Thread(target=systemTask)