diff --git a/plugins/swap/ico.png b/plugins/swap/ico.png
new file mode 100644
index 000000000..4ff64f09e
Binary files /dev/null and b/plugins/swap/ico.png differ
diff --git a/plugins/swap/index.html b/plugins/swap/index.html
new file mode 100755
index 000000000..8711087f3
--- /dev/null
+++ b/plugins/swap/index.html
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/plugins/swap/index.py b/plugins/swap/index.py
new file mode 100755
index 000000000..482a63778
--- /dev/null
+++ b/plugins/swap/index.py
@@ -0,0 +1,221 @@
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+
+sys.path.append(os.getcwd() + "/class/core")
+import mw
+
+app_debug = False
+if mw.isAppleSystem():
+ app_debug = True
+
+
+def getPluginName():
+ return 'swap'
+
+
+def getPluginDir():
+ return mw.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return mw.getServerDir() + '/' + getPluginName()
+
+
+def getInitDFile():
+ if app_debug:
+ return '/tmp/' + getPluginName()
+ return '/etc/init.d/' + getPluginName()
+
+
+def getConf():
+ path = getPluginDir() + "/config/redis.conf"
+ return path
+
+
+def getInitDTpl():
+ path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
+ return path
+
+
+def getArgs():
+ args = sys.argv[2:]
+ tmp = {}
+ args_len = len(args)
+
+ if args_len == 1:
+ t = args[0].strip('{').strip('}')
+ t = t.split(':')
+ tmp[t[0]] = t[1]
+ elif args_len > 1:
+ for i in range(len(args)):
+ t = args[i].split(':')
+ tmp[t[0]] = t[1]
+
+ return tmp
+
+
+def status():
+ data = mw.execShell(
+ "ps -ef|grep swap |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
+
+ if data[0] == '':
+ return 'stop'
+ return 'start'
+
+
+def initDreplace():
+
+ file_tpl = getInitDTpl()
+ service_path = os.path.dirname(os.getcwd())
+
+ initD_path = getServerDir() + '/init.d'
+ if not os.path.exists(initD_path):
+ os.mkdir(initD_path)
+ file_bin = initD_path + '/' + getPluginName()
+
+ # initd replace
+ content = mw.readFile(file_tpl)
+ content = content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(file_bin, content)
+ mw.execShell('chmod +x ' + file_bin)
+
+ # config replace
+ conf_content = mw.readFile(getConf())
+ conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(getServerDir() + '/redis.conf', conf_content)
+
+ return file_bin
+
+
+def start():
+ file = initDreplace()
+ data = mw.execShell(file + ' start')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def stop():
+ file = initDreplace()
+ data = mw.execShell(file + ' stop')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def restart():
+ file = initDreplace()
+ data = mw.execShell(file + ' restart')
+ log_file = getServerDir() + "/data/redis.log"
+ mw.execShell("echo '' > " + log_file)
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def reload():
+ file = initDreplace()
+ data = mw.execShell(file + ' reload')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def runInfo():
+ cmd = getServerDir() + "/bin/redis-cli info"
+ data = mw.execShell(cmd)[0]
+ res = [
+ 'tcp_port',
+ 'uptime_in_days', # 已运行天数
+ 'connected_clients', # 连接的客户端数量
+ 'used_memory', # Redis已分配的内存总量
+ 'used_memory_rss', # Redis占用的系统内存总量
+ 'used_memory_peak', # Redis所用内存的高峰值
+ 'mem_fragmentation_ratio', # 内存碎片比率
+ 'total_connections_received', # 运行以来连接过的客户端的总数量
+ 'total_commands_processed', # 运行以来执行过的命令的总数量
+ 'instantaneous_ops_per_sec', # 服务器每秒钟执行的命令数量
+ 'keyspace_hits', # 查找数据库键成功的次数
+ 'keyspace_misses', # 查找数据库键失败的次数
+ 'latest_fork_usec' # 最近一次 fork() 操作耗费的毫秒数
+ ]
+ data = data.split("\n")
+ result = {}
+ for d in data:
+ if len(d) < 3:
+ continue
+ t = d.strip().split(':')
+ if not t[0] in res:
+ continue
+ result[t[0]] = t[1]
+ return mw.getJson(result)
+
+
+def initdStatus():
+ if not app_debug:
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+ initd_bin = getInitDFile()
+ if os.path.exists(initd_bin):
+ return 'ok'
+ return 'fail'
+
+
+def initdInstall():
+ import shutil
+ if not app_debug:
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ source_bin = initDreplace()
+ initd_bin = getInitDFile()
+ shutil.copyfile(source_bin, initd_bin)
+ mw.execShell('chmod +x ' + initd_bin)
+ mw.execShell('chkconfig --add ' + getPluginName())
+ return 'ok'
+
+
+def initdUinstall():
+ if not app_debug:
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ mw.execShell('chkconfig --del ' + getPluginName())
+ initd_bin = getInitDFile()
+ os.remove(initd_bin)
+ return 'ok'
+
+
+def runLog():
+ return getServerDir() + '/data/redis.log'
+
+if __name__ == "__main__":
+ func = sys.argv[1]
+ if func == 'status':
+ print status()
+ elif func == 'start':
+ print start()
+ elif func == 'stop':
+ print stop()
+ elif func == 'restart':
+ print restart()
+ elif func == 'reload':
+ print reload()
+ elif func == 'initd_status':
+ print initdStatus()
+ elif func == 'initd_install':
+ print initdInstall()
+ elif func == 'initd_uninstall':
+ print initdUinstall()
+ elif func == 'run_info':
+ print runInfo()
+ elif func == 'conf':
+ print getConf()
+ elif func == 'run_log':
+ print runLog()
+ else:
+ print 'error'
diff --git a/plugins/swap/info.json b/plugins/swap/info.json
new file mode 100755
index 000000000..8511f7d01
--- /dev/null
+++ b/plugins/swap/info.json
@@ -0,0 +1,17 @@
+{
+ "sort": 7,
+ "ps": "Linux虚拟内存",
+ "name": "swap",
+ "title": "swap",
+ "shell": "install.sh",
+ "versions":"1.0",
+ "tip": "soft",
+ "checks": "server/swap",
+ "path": "server/swap",
+ "display": 1,
+ "author": "midoks",
+ "date": "2021-01-29",
+ "home": "swap",
+ "type": 0,
+ "pid": "4"
+}
\ No newline at end of file
diff --git a/plugins/swap/init.d/swap.tpl b/plugins/swap/init.d/swap.tpl
new file mode 100644
index 000000000..02e0440c2
--- /dev/null
+++ b/plugins/swap/init.d/swap.tpl
@@ -0,0 +1,73 @@
+#!/bin/sh
+# chkconfig: 2345 55 25
+# description: Redis Service
+
+### BEGIN INIT INFO
+# Provides: Redis
+# Required-Start: $all
+# Required-Stop: $all
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: starts Redis
+# Description: starts the MDW-Web
+### END INIT INFO
+
+# Simple Redis init.d script conceived to work on Linux systems
+# as it does use of the /proc filesystem.
+
+CONF="{$SERVER_PATH}/redis/redis.conf"
+REDISPORT=$(cat $CONF |grep port|grep -v '#'|awk '{print $2}')
+REDISPASS=$(cat $CONF |grep requirepass|grep -v '#'|awk '{print $2}')
+if [ "$REDISPASS" != "" ];then
+ REDISPASS=" -a $REDISPASS"
+fi
+EXEC={$SERVER_PATH}/redis/bin/redis-server
+CLIEXEC="{$SERVER_PATH}/redis/bin/redis-cli -p $REDISPORT$REDISPASS"
+PIDFILE={$SERVER_PATH}/redis/redis_6379.pid
+
+mkdir -p {$SERVER_PATH}/redis/data
+
+redis_start(){
+ if [ -f $PIDFILE ];then
+ kill -9 `cat $PIDFILE`
+ fi
+
+ echo "Starting Redis server..."
+ nohup $EXEC $CONF >> {$SERVER_PATH}/redis/logs.pl 2>&1 &
+}
+redis_stop(){
+ if [ ! -f $PIDFILE ]
+ then
+ echo "$PIDFILE does not exist, process is not running"
+ else
+ PID=$(cat $PIDFILE)
+ echo "Stopping ..."
+ $CLIEXEC shutdown
+ while [ -x /proc/${PID} ]
+ do
+ echo "Waiting for Redis to shutdown ..."
+ sleep 1
+ done
+ echo "Redis stopped"
+ rm -rf $PIDFILE
+ fi
+}
+
+
+case "$1" in
+ start)
+ redis_start
+ ;;
+ stop)
+ redis_stop
+ ;;
+ restart|reload)
+ redis_stop
+ sleep 0.3
+ redis_start
+ ;;
+ *)
+ echo "Please use start or stop as first argument"
+ ;;
+esac
+
diff --git a/plugins/swap/install.sh b/plugins/swap/install.sh
new file mode 100755
index 000000000..ec9edaacb
--- /dev/null
+++ b/plugins/swap/install.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+curPath=`pwd`
+rootPath=$(dirname "$curPath")
+rootPath=$(dirname "$rootPath")
+serverPath=$(dirname "$rootPath")
+SYSOS=`uname`
+
+install_tmp=${rootPath}/tmp/mw_install.pl
+
+VERSION=$2
+
+Install_swap()
+{
+ echo '正在安装脚本文件...' > $install_tmp
+ mkdir -p $serverPath/source
+ mkdir -p $serverPath/swap
+ echo "${VERSION}" > $serverPath/swap/version.pl
+
+ if [ "$sysName" == "Darwin" ];then
+ pass
+ else
+ dd if=/dev/zero of=/swapfile bs=1M count=1024
+ chmod 600 /swapfile
+ mkswap /swapfile
+ swapon /swapfile
+ fi
+
+ echo '安装完成' > $install_tmp
+}
+
+Uninstall_swap()
+{
+ rm -rf $serverPath/swap
+ echo "Uninstall_swap" > $install_tmp
+}
+
+action=$1
+if [ "${1}" == 'install' ];then
+ Install_swap
+else
+ Uninstall_swap
+fi