You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2022/10/31 00:28:37 UTC

[iotdb] branch feat-4230-0.14 created (now 2315f19be6)

This is an automated email from the ASF dual-hosted git repository.

hxd pushed a change to branch feat-4230-0.14
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 2315f19be6 add -p pid, -v version feature into start-server.sh

This branch includes the following new commits:

     new 2315f19be6 add -p pid, -v version feature into start-server.sh

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[iotdb] 01/01: add -p pid, -v version feature into start-server.sh

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch feat-4230-0.14
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 2315f19be6259fed6826eccf9c4bd7363c79adfb
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Mon Oct 31 08:28:20 2022 +0800

    add -p pid, -v version feature into start-server.sh
---
 .../src/assembly/resources/conf/logback-cli.xml    |  20 ++-
 cli/src/assembly/resources/sbin/start-cli.sh       |  81 +++++++++
 cli/src/assembly/resources/tools/export-csv.sh     |   7 +
 cli/src/assembly/resources/tools/export-tsfile.sh  |   7 +
 cli/src/assembly/resources/tools/import-csv.sh     |   7 +
 .../src/assembly/resources/conf/confignode-env.bat |   5 +
 .../src/assembly/resources/conf/confignode-env.sh  |  10 ++
 .../src/assembly/resources/conf/logback-tool.xml   |  16 +-
 .../src/assembly/resources/sbin/iotdb-common.sh    | 126 +++++++++++++
 .../assembly/resources/sbin/remove-confignode.sh   |  59 ++-----
 .../assembly/resources/sbin/start-confignode.bat   |  55 +++++-
 .../assembly/resources/sbin/start-confignode.sh    | 168 +++++++++++++-----
 .../assembly/resources/sbin/stop-confignode.bat    |   3 +
 .../src/assembly/resources/sbin/stop-confignode.sh |   4 +-
 .../iotdb/confignode/conf/ConfigNodeConstant.java  |   3 +
 .../iotdb/confignode/service/ConfigNode.java       |  10 ++
 docs/UserGuide/QuickStart/QuickStart.md            |  31 +++-
 docs/zh/UserGuide/QuickStart/QuickStart.md         |  20 ++-
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |   5 +
 .../src/assembly/resources/conf/datanode-env.bat   |   5 +
 server/src/assembly/resources/conf/datanode-env.sh |  10 ++
 .../src/assembly/resources/conf/logback-tool.xml   |  16 +-
 server/src/assembly/resources/sbin/iotdb-common.sh | 130 ++++++++++++++
 .../src/assembly/resources/sbin/remove-datanode.sh |  45 ++---
 .../src/assembly/resources/sbin/start-datanode.bat |  58 +++++-
 .../src/assembly/resources/sbin/start-datanode.sh  | 194 +++++++++++++++------
 .../assembly/resources/sbin/start-new-server.bat   |  55 +++++-
 .../assembly/resources/sbin/start-new-server.sh    | 182 ++++++++++++++-----
 .../src/assembly/resources/sbin/start-server.bat   |  57 +++++-
 server/src/assembly/resources/sbin/start-server.sh | 180 ++++++++++++++-----
 .../src/assembly/resources/sbin/stop-datanode.bat  |   3 +
 .../src/assembly/resources/sbin/stop-datanode.sh   |   4 +-
 .../assembly/resources/tools/detect-watermark.sh   |   9 +-
 .../resources/tools/schema/SchemaFileSketcher.sh   |   8 +-
 .../assembly/resources/tools/schema/mLogParser.sh  |   8 +-
 .../assembly/resources/tools/start-WalChecker.sh   |   9 +-
 .../tools/tsfileToolSet/print-iotdb-data-dir.sh    |   9 +-
 .../tsfileToolSet/print-tsfile-resource-files.sh   |  10 +-
 .../tools/tsfileToolSet/print-tsfile-sketch.sh     |   9 +-
 .../tools/tsfileToolSet/print-tsfile-visdata.sh    |   8 +-
 .../resources/tools/tsfileToolSet/settle.sh        |   8 +-
 .../tools/tsfileToolSet/split-tsfile-tool.sh       |   8 +-
 .../tools/tsfileToolSet/validate-tsfile.sh         |   8 +-
 server/src/assembly/server.xml                     |  13 ++
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  65 ++++---
 .../java/org/apache/iotdb/db/service/DataNode.java |   9 +
 .../org/apache/iotdb/db/service/GetVersion.java    |  27 +++
 .../java/org/apache/iotdb/db/service/IoTDB.java    |  10 ++
 .../java/org/apache/iotdb/db/service/NewIoTDB.java |   9 +
 .../org/apache/iotdb/db/service/DaemonTest.java    |  39 +++++
 50 files changed, 1492 insertions(+), 350 deletions(-)

diff --git a/confignode/src/assembly/resources/conf/logback-tool.xml b/cli/src/assembly/resources/conf/logback-cli.xml
similarity index 62%
copy from confignode/src/assembly/resources/conf/logback-tool.xml
copy to cli/src/assembly/resources/conf/logback-cli.xml
index 98f3f9d5c0..1f80786a9c 100644
--- a/confignode/src/assembly/resources/conf/logback-tool.xml
+++ b/cli/src/assembly/resources/conf/logback-cli.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
@@ -8,15 +7,26 @@
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at
-
         http://www.apache.org/licenses/LICENSE-2.0
-
     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
-
 -->
-<configuration/>
+<configuration scan="true" scanPeriod="60 seconds">
+    <appender class="ch.qos.logback.core.ConsoleAppender" name="stdout">
+        <Target>System.out</Target>
+        <encoder>
+            <pattern>%d [%t] %-5p %C{25}:%L - %m %n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+    <root level="error">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
diff --git a/cli/src/assembly/resources/sbin/start-cli.sh b/cli/src/assembly/resources/sbin/start-cli.sh
index dbeedc7250..d78ff4a2e5 100644
--- a/cli/src/assembly/resources/sbin/start-cli.sh
+++ b/cli/src/assembly/resources/sbin/start-cli.sh
@@ -21,6 +21,87 @@
 # You can put your env variable here
 # export JAVA_HOME=$JAVA_HOME
 
+
+# this function is for parsing the variables like "A=B" in  `start-server.sh -D A=B`
+# The command just parse IOTDB-prefixed variables and ignore all other variables
+checkEnvVaribles()
+{
+  string="$1"
+  array=$(echo $string | tr '=' ' ')
+  eval set -- "$array"
+  case "$1" in
+          IOTDB_INCLUDE)
+               IOTDB_INCLUDE="$2"
+          ;;
+          IOTDB_CLI_CONF)
+              IOTDB_CLI_CONF="$2"
+          ;;
+          *)
+            #do nothing
+          ;;
+      esac
+}
+
+PARAMETERS=""
+
+# if [ $# -eq 0 ]
+# then
+# 	PARAMETERS="-h 127.0.0.1 -p 6667 -u root -pw root"
+# fi
+
+# Added parameters when default parameters are missing
+user_param="-u root"
+passwd_param="-pw root"
+host_param="-h 127.0.0.1"
+port_param="-p 6667"
+
+while true; do
+    case "$1" in
+        -u)
+            user_param="-u $2"
+            shift 2
+            ;;
+        -pw)
+            passwd_param="-pw $2"
+            shift 2
+        ;;
+        -h)
+            host_param="-h $2"
+            shift 2
+        ;;
+        -p)
+            port_param="-p $2"
+            shift 2
+        ;;
+        -D)
+            checkEnvVaribles $2
+            shift 2
+        ;;
+        --help)
+            echo "Usage: $0 [-h <ip>] [-p <port>] [-u <username>] [-pw <password>] [-D <name=value>] [-c] [-e sql] [-maxPRC <PRC size>]"
+            exit 0
+        ;;
+        "")
+              #if we do not use getopt, we then have to process the case that there is no argument.
+              shift
+              break
+              ;;
+        *)
+            PARAMETERS="$PARAMETERS $1"
+            shift
+        ;;
+    esac
+done
+
+PARAMETERS="$host_param $port_param $user_param $passwd_param $PARAMETERS"
+
+if [ -z "${IOTDB_INCLUDE}" ]; then
+  #do nothing
+  :
+elif [ -r "$IOTDB_INCLUDE" ]; then
+    . "$IOTDB_INCLUDE"
+fi
+
 if [ -z "${IOTDB_HOME}" ]; then
   export IOTDB_HOME="$(cd "`dirname "$0"`"/..; pwd)"
 fi
diff --git a/cli/src/assembly/resources/tools/export-csv.sh b/cli/src/assembly/resources/tools/export-csv.sh
index 607a43ac2d..2e532928e4 100644
--- a/cli/src/assembly/resources/tools/export-csv.sh
+++ b/cli/src/assembly/resources/tools/export-csv.sh
@@ -22,6 +22,13 @@ echo ------------------------------------------
 echo Starting IoTDB Client Export Script
 echo ------------------------------------------
 
+if [ -z "${IOTDB_INCLUDE}" ]; then
+  #do nothing
+  :
+elif [ -r "$IOTDB_INCLUDE" ]; then
+    . "$IOTDB_INCLUDE"
+fi
+
 if [ -z "${IOTDB_HOME}" ]; then
     export IOTDB_HOME="$(cd "`dirname "$0"`"/..; pwd)"
 fi
diff --git a/cli/src/assembly/resources/tools/export-tsfile.sh b/cli/src/assembly/resources/tools/export-tsfile.sh
index 2ccc30ae65..e0705dee06 100644
--- a/cli/src/assembly/resources/tools/export-tsfile.sh
+++ b/cli/src/assembly/resources/tools/export-tsfile.sh
@@ -22,6 +22,13 @@ echo ------------------------------------------
 echo Starting IoTDB Client Export Script
 echo ------------------------------------------
 
+if [ -z "${IOTDB_INCLUDE}" ]; then
+  #do nothing
+  :
+elif [ -r "$IOTDB_INCLUDE" ]; then
+    . "$IOTDB_INCLUDE"
+fi
+
 if [ -z "${IOTDB_HOME}" ]; then
     export IOTDB_HOME="$(cd "`dirname "$0"`"/..; pwd)"
 fi
diff --git a/cli/src/assembly/resources/tools/import-csv.sh b/cli/src/assembly/resources/tools/import-csv.sh
index 6389816fdc..1ff18e0bf0 100644
--- a/cli/src/assembly/resources/tools/import-csv.sh
+++ b/cli/src/assembly/resources/tools/import-csv.sh
@@ -22,6 +22,13 @@ echo ------------------------------------------
 echo Starting IoTDB Client Import Script
 echo ------------------------------------------
 
+if [ -z "${IOTDB_INCLUDE}" ]; then
+  #do nothing
+  :
+elif [ -r "$IOTDB_INCLUDE" ]; then
+    . "$IOTDB_INCLUDE"
+fi
+
 if [ -z "${IOTDB_HOME}" ]; then
     export IOTDB_HOME="$(cd "`dirname "$0"`"/..; pwd)"
 fi
diff --git a/confignode/src/assembly/resources/conf/confignode-env.bat b/confignode/src/assembly/resources/conf/confignode-env.bat
index e00a464764..5d85f351c3 100644
--- a/confignode/src/assembly/resources/conf/confignode-env.bat
+++ b/confignode/src/assembly/resources/conf/confignode-env.bat
@@ -77,6 +77,11 @@ if %desired_yg_in_mb% GTR %max_sensible_yg_in_mb% (
 	set HEAP_NEWSIZE=%max_sensible_yg_in_mb%M
 ) else set HEAP_NEWSIZE=%desired_yg_in_mb%M
 
+@REM if the heap size is larger than 16GB, we will forbid writing the heap dump file
+if %desired_yg_in_mb% GTR 16384 (
+	set IOTDB_ALLOW_HEAP_DUMP="false"
+) else set IOTDB_ALLOW_HEAP_DUMP="true"
+
 @REM Maximum heap size
 @REM set MAX_HEAP_SIZE="2G"
 @REM Minimum heap size
diff --git a/confignode/src/assembly/resources/conf/confignode-env.sh b/confignode/src/assembly/resources/conf/confignode-env.sh
index 19773bb974..dd806b6307 100644
--- a/confignode/src/assembly/resources/conf/confignode-env.sh
+++ b/confignode/src/assembly/resources/conf/confignode-env.sh
@@ -57,6 +57,9 @@ case "$(uname)" in
     ;;
 esac
 
+# whether we allow enable heap dump files
+IOTDB_ALLOW_HEAP_DUMP="true"
+
 calculate_heap_sizes()
 {
     case "`uname`" in
@@ -115,6 +118,13 @@ calculate_heap_sizes()
     fi
     MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
 
+    # if the heap size is larger than 16GB, we will forbid writing the heap dump file
+    if [ "$max_heap_size_in_mb" -gt "16384" ]
+    then
+       echo "IoTDB memory is too large ($max_heap_size_in_mb MB), will forbid writing heap dump file"
+       IOTDB_ALLOW_HEAP_DUMP="false"
+    fi
+
     # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
     max_sensible_yg_per_core_in_mb="100"
     max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`
diff --git a/confignode/src/assembly/resources/conf/logback-tool.xml b/confignode/src/assembly/resources/conf/logback-tool.xml
index 98f3f9d5c0..7b0e9b8295 100644
--- a/confignode/src/assembly/resources/conf/logback-tool.xml
+++ b/confignode/src/assembly/resources/conf/logback-tool.xml
@@ -19,4 +19,18 @@
     under the License.
 
 -->
-<configuration/>
+<configuration scan="true" scanPeriod="60 seconds">
+    <appender class="ch.qos.logback.core.ConsoleAppender" name="stdout">
+        <Target>System.out</Target>
+        <encoder>
+            <pattern>%d [%t] %-5p %C{25}:%L - %m %n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+    <root level="error">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
diff --git a/confignode/src/assembly/resources/sbin/iotdb-common.sh b/confignode/src/assembly/resources/sbin/iotdb-common.sh
new file mode 100755
index 0000000000..c1f7663ac3
--- /dev/null
+++ b/confignode/src/assembly/resources/sbin/iotdb-common.sh
@@ -0,0 +1,126 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+# this function is for parsing the variables like "A=B" in  `start-server.sh -D A=B`
+# The command just parse IOTDB-prefixed variables and ignore all other variables
+checkEnvVaribles()
+{
+  string="$1"
+  array=$(echo $string | tr '=' ' ')
+  eval set -- "$array"
+  case "$1" in
+          IOTDB_INCLUDE)
+               IOTDB_INCLUDE="$2"
+          ;;
+          CONFIGNODE_HOME)
+               CONFIGNODE_HOME="$2"
+          ;;
+          CONFIGNODE_DATA_HOME)
+             CONFIGNODE_DATA_HOME="$2"
+          ;;
+          CONFIGNODE_CONF)
+             CONFIGNODE_CONF="$2"
+          ;;
+          CONFIGNODE_LOGS)
+             CONFIGNODE_LOGS="$2"
+          ;;
+          CONFIGNODE_LOG_CONFIG)
+             CONFIGNODE_LOG_CONFIG="$2"
+          ;;
+          *)
+            #we can not process it, so that we return back.
+            echo "$1=$2"
+          ;;
+  esac
+  echo ""
+}
+
+checkAllVariables()
+{
+  if [ -z "${IOTDB_INCLUDE}" ]; then
+    #do nothing
+    :
+  elif [ -r "$IOTDB_INCLUDE" ]; then
+      . "$IOTDB_INCLUDE"
+  fi
+
+  if [ -z "${CONFIGNODE_HOME}" ]; then
+    export CONFIGNODE_HOME="`dirname "$0"`/.."
+  fi
+
+  if [ -z "${CONFIGNODE_DATA_HOME}" ]; then
+    export CONFIGNODE_DATA_HOME=${CONFIGNODE_HOME}
+  fi
+
+  if [ -z "${CONFIGNODE_CONF}" ]; then
+    export CONFIGNODE_CONF=${CONFIGNODE_HOME}/conf
+  fi
+
+  if [ -z "${CONFIGNODE_LOGS}" ]; then
+    export CONFIGNODE_LOGS=${CONFIGNODE_HOME}/logs
+  fi
+
+  if [ -z "${CONFIGNODE_LOG_CONFIG}" ]; then
+    export CONFIGNODE_LOG_CONFIG="${CONFIGNODE_HOME}/logback-confignode.xml"
+  fi
+}
+
+initEnv() {
+  if [ -f "$IOTDB_CONF/confignode-env.sh" ]; then
+      if [ "x$PRINT_GC" != "x" ]; then
+        . "$IOTDB_CONF/confignode-env.sh" "printgc"
+      else
+          . "$IOTDB_CONF/confignode-env.sh"
+      fi
+  elif [ -f "${CONFIGNODE_HOME}/conf/confignode-env.sh" ]; then
+      if [ "x$PRINT_GC" != "x" ]; then
+        . "${CONFIGNODE_HOME}/conf/confignode-env.sh" "printgc"
+      else
+        . "${CONFIGNODE_HOME}/conf/confignode-env.sh"
+      fi
+  else
+      echo "can't find $IOTDB_CONF/confignode-env.sh"
+  fi
+}
+
+get_iotdb_include() {
+  #reset $1 to $* for this command
+  eval set -- "$1"
+  VARS=""
+  while true; do
+      case "$1" in
+          -D)
+              VARS="$VARS $(checkEnvVaribles $2)"
+              shift 2
+          ;;
+          "")
+          #if we do not use getopt, we then have to process the case that there is no argument.
+              shift
+              break
+          ;;
+          *)
+              VARS="$VARS $1"
+              shift
+          ;;
+      esac
+  done
+  echo "$VARS"
+}
\ No newline at end of file
diff --git a/confignode/src/assembly/resources/sbin/remove-confignode.sh b/confignode/src/assembly/resources/sbin/remove-confignode.sh
old mode 100644
new mode 100755
index 6ba7712b5c..cc49c914fe
--- a/confignode/src/assembly/resources/sbin/remove-confignode.sh
+++ b/confignode/src/assembly/resources/sbin/remove-confignode.sh
@@ -22,58 +22,35 @@ echo ----------------------------
 echo Starting to remove IoTDB ConfigNode
 echo ----------------------------
 
-if [ -z "${CONFIGNODE_HOME}" ]; then
-  export CONFIGNODE_HOME="$(dirname "$0")/.."
-fi
+source "$(dirname "$0")/iotdb-common.sh"
 
-CONFIGNODE_CONF=${CONFIGNODE_HOME}/conf
-CONFIGNODE_LOGS=${CONFIGNODE_HOME}/logs
+#get_iotdb_include wil remove -D parameters
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
-is_conf_path=false
-for arg; do
-  shift
-  if [ "$arg" == "-c" ]; then
-    is_conf_path=true
-    continue
-  fi
-  if [ $is_conf_path == true ]; then
-    CONFIGNODE_CONF=$arg
-    is_conf_path=false
-    continue
-  fi
-  set -- "$@" "$arg"
-done
-
-CONF_PARAMS="-r "$*
-
-if [ -f "$CONFIGNODE_CONF/confignode-env.sh" ]; then
-  if [ "$#" -ge "1" -a "$1" == "printgc" ]; then
-    . "$CONFIGNODE_CONF/confignode-env.sh" "printgc"
-  else
-    . "$CONFIGNODE_CONF/confignode-env.sh"
-  fi
-else
-  echo "can't find $CONFIGNODE_CONF/confignode-env.sh"
-fi
+PARAMS="-r "$*
 
-if [ -d ${CONFIGNODE_HOME}/lib ]; then
-  LIB_PATH=${CONFIGNODE_HOME}/lib
-else
-  LIB_PATH=${CONFIGNODE_HOME}/../lib
-fi
+initEnv
 
 CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
+for f in ${CONFIGNODE_HOME}/lib/*.jar; do
   CLASSPATH=${CLASSPATH}":"$f
 done
 classname=org.apache.iotdb.confignode.service.ConfigNode
 
 launch_service() {
   class="$1"
-  confignode_parms="-Dlogback.configurationFile=${CONFIGNODE_CONF}/logback-confignode.xml"
-  confignode_parms="$confignode_parms -DCONFIGNODE_HOME=${CONFIGNODE_HOME}"
-  confignode_parms="$confignode_parms -DCONFIGNODE_CONF=${CONFIGNODE_CONF}"
-  exec "$JAVA" $illegal_access_params $confignode_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
+    iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_HOME=${CONFIGNODE_HOME}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_DATA_HOME=${CONFIGNODE_DATA_HOME}"
+  	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${CONFIGNODE_HOME}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_CONF=${CONFIGNODE_CONF}"
+  	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${CONFIGNODE_CONF}"
+  	iotdb_parms="$iotdb_parms -Dname=iotdb\.ConfigNode"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_LOGS=${CONFIGNODE_LOGS}"
+
+  exec "$JAVA" $illegal_access_params $iotdb_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" "$class" $PARAMS
   return $?
 }
 
diff --git a/confignode/src/assembly/resources/sbin/start-confignode.bat b/confignode/src/assembly/resources/sbin/start-confignode.bat
index fff33a75b7..674e155890 100644
--- a/confignode/src/assembly/resources/sbin/start-confignode.bat
+++ b/confignode/src/assembly/resources/sbin/start-confignode.bat
@@ -107,17 +107,58 @@ goto :eof
 
 rem echo CLASSPATH: %CLASSPATH%
 
-"%JAVA_HOME%\bin\java" %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %CONFIGNODE_HEAP_OPTS% -cp %CLASSPATH% %CONFIGNODE_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+@REM SET PARA
+
+@REM Before v0.14, iotdb-server runs in foreground by default
+@REM set foreground=0
+set foreground=yes
+
+:checkPara
+set COMMANSLINE=%*
+@REM setlocal ENABLEDELAYEDEXPANSION
+:STR_VISTOR
+for /f "tokens=1* delims= " %%a in ("%COMMANSLINE%") do (
+@REM -----more para-----
+for /f "tokens=1* delims==" %%1 in ("%%a") do (
+@REM echo 1=%%1 "|||" 2=%%2
+if "%%1"=="-v" ( java %JAVA_OPTS% -Dlogback.configurationFile="%IOTDB_CONF%/logback-tool.xml" -cp %CLASSPATH% org.apache.iotdb.db.service.GetVersion & goto finally )
+if "%%1"=="-f" ( set foreground=yes)
+if "%%1"=="-b" ( set foreground=0)
+)
+set COMMANSLINE=%%b
+goto STR_VISTOR
+)
+
+@REM SETLOCAL DISABLEDELAYEDEXPANSION
+
+echo ````````````````````````
+echo Starting IoTDB
+echo ````````````````````````
+
+@REM ----------------------------------------------------------------------------
+@REM SOURCE iotdb-env.bat
+IF EXIST "%IOTDB_CONF%\iotdb-env.bat" (
+    CALL "%IOTDB_CONF%\iotdb-env.bat" %1
+    ) ELSE (
+    echo "can't find %IOTDB_CONF%\iotdb-env.bat"
+    )
+if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.db.service.IoTDB
+if NOT DEFINED JAVA_HOME goto :err
+
+@REM ----------------------------------------------------------------------------
+@REM START
+:start
+if %foreground%==yes (
+	java %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	) ELSE (
+	start javaw %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	)
 goto finally
 
 :err
 echo JAVA_HOME environment variable must be set!
 pause
 
-
-@REM -----------------------------------------------------------------------------
 :finally
-
-pause
-
-ENDLOCAL
+@ENDLOCAL
+pause
\ No newline at end of file
diff --git a/confignode/src/assembly/resources/sbin/start-confignode.sh b/confignode/src/assembly/resources/sbin/start-confignode.sh
index 85d0c61e3c..9f7b6e8d8a 100644
--- a/confignode/src/assembly/resources/sbin/start-confignode.sh
+++ b/confignode/src/assembly/resources/sbin/start-confignode.sh
@@ -22,59 +22,143 @@ echo ----------------------------
 echo Starting IoTDB ConfigNode
 echo ----------------------------
 
-if [ -z "${CONFIGNODE_HOME}" ]; then
-  export CONFIGNODE_HOME="$(dirname "$0")/.."
-fi
-
-CONFIGNODE_CONF=${CONFIGNODE_HOME}/conf
-CONFIGNODE_LOGS=${CONFIGNODE_HOME}/logs
-
-is_conf_path=false
-for arg; do
-  shift
-  if [ "$arg" == "-c" ]; then
-    is_conf_path=true
-    continue
-  fi
-  if [ $is_conf_path == true ]; then
-    CONFIGNODE_CONF=$arg
-    is_conf_path=false
-    continue
-  fi
-  set -- "$@" "$arg"
+
+
+source "$(dirname "$0")/iotdb-common.sh"
+
+# iotdb server runs on foreground by default
+foreground="yes"
+
+IOTDB_HEAP_DUMP_COMMAND=""
+
+echo "all parameters are $*"
+while true; do
+    case "$1" in
+        -c)
+            CONFIGNODE_CONF="$2"
+            shift 2
+            ;;
+        -p)
+            pidfile="$2"
+            shift 2
+        ;;
+        -f)
+            foreground="yes"
+            shift
+        ;;
+        -b)
+            foreground=""
+            shift
+        ;;
+        -g)
+            PRINT_GC="yes"
+            shift
+        ;;
+        -H)
+            IOTDB_HEAP_DUMP_COMMAND="$IOTDB_HEAP_DUMP_COMMAND -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$2"
+            shift 2
+        ;;
+        -E)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:ErrorFile=$2"
+            shift 2
+        ;;
+        -D)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -D$2"
+            #checkEnvVaribles is in iotdb-common.sh
+            checkEnvVaribles $2
+            shift 2
+        ;;
+        -X)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:$2"
+            shift 2
+        ;;
+        -h)
+            echo "Usage: $0 [-v] [-f] [-b] [-h] [-p pidfile] [-c configFolder] [-H HeapDumpPath] [-E JvmErrorFile] [printgc]"
+            exit 0
+        ;;
+        -v)
+            #SHOW_VERSION="yes"
+            break
+            echo "show version is not supported in current version on ConfigNode"
+            exit 1
+        ;;
+        --)
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        "")
+        #if we do not use getopt, we then have to process the case that there is no argument.
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        *)
+            echo "Error parsing arguments! Unknown argument \"$1\"" >&2
+            exit 1
+        ;;
+    esac
 done
 
-CONF_PARAMS="-s "$*
+#checkAllVariables is in iotdb-common.sh
+checkAllVariables
+
 
-if [ -f "$CONFIGNODE_CONF/confignode-env.sh" ]; then
-  if [ "$#" -ge "1" -a "$1" == "printgc" ]; then
-    . "$CONFIGNODE_CONF/confignode-env.sh" "printgc"
-  else
-    . "$CONFIGNODE_CONF/confignode-env.sh"
-  fi
-else
-  echo "can't find $CONFIGNODE_CONF/confignode-env.sh"
-fi
 
-if [ -d ${CONFIGNODE_HOME}/lib ]; then
-  LIB_PATH=${CONFIGNODE_HOME}/lib
-else
-  LIB_PATH=${CONFIGNODE_HOME}/../lib
-fi
+PARAMS="-s $PARAMS"
+
+#initEnv is in iotdb-common.sh
+initEnv
+
 
 CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
+for f in ${CONFIGNODE_HOME}/lib/*.jar; do
   CLASSPATH=${CLASSPATH}":"$f
 done
 classname=org.apache.iotdb.confignode.service.ConfigNode
 
 launch_service() {
-  class="$1"
-  confignode_parms="-Dlogback.configurationFile=${CONFIGNODE_CONF}/logback-confignode.xml"
-  confignode_parms="$confignode_parms -DCONFIGNODE_HOME=${CONFIGNODE_HOME}"
-  confignode_parms="$confignode_parms -DCONFIGNODE_CONF=${CONFIGNODE_CONF}"
-  exec "$JAVA" $illegal_access_params $confignode_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
-  return $?
+    class="$1"
+    iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_HOME=${CONFIGNODE_HOME}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_DATA_HOME=${CONFIGNODE_DATA_HOME}"
+  	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${CONFIGNODE_HOME}"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_CONF=${CONFIGNODE_CONF}"
+  	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${CONFIGNODE_CONF}"
+  	iotdb_parms="$iotdb_parms -Dname=iotdb\.ConfigNode"
+  	iotdb_parms="$iotdb_parms -DCONFIGNODE_LOGS=${CONFIGNODE_LOGS}"
+
+  	  if [ "x$pidfile" != "x" ]; then
+         iotdb_parms="$iotdb_parms -Diotdb-pidfile=$pidfile"
+      fi
+
+    # The iotdb-foreground option will tell IoTDB not to close stdout/stderr, but it's up to us not to background.
+      if [ "x$foreground" == "xyes" ]; then
+          iotdb_parms="$iotdb_parms -Diotdb-foreground=yes"
+          if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+            [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+          else
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+          fi
+      # Startup IoTDB, background it, and write the pid.
+      else
+          if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+                exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null  <&- &
+                [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+                true
+          else
+                exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $CONFIGNODE_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null <&- &
+                [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+                true
+          fi
+      fi
+
+  	return $?
+
 }
 
 # Start up the service
diff --git a/confignode/src/assembly/resources/sbin/stop-confignode.bat b/confignode/src/assembly/resources/sbin/stop-confignode.bat
index 78dca81e12..1a098cf2a7 100644
--- a/confignode/src/assembly/resources/sbin/stop-confignode.bat
+++ b/confignode/src/assembly/resources/sbin/stop-confignode.bat
@@ -27,6 +27,8 @@ for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "^internal_port"
   set internal_port=%%i
 )
 
+echo "check whether the rpc_port is used..., port is" $rpc_port
+
 for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "internal_address"
 %superior_dir%\conf\iotdb-confignode.properties') do (
   set internal_address=%%i
@@ -34,5 +36,6 @@ for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "internal_address"
 
 for /f "tokens=5" %%a in ('netstat /ano ^| findstr %internal_address%:%internal_port%') do (
   taskkill /f /pid %%a
+    echo "close ConfigNode, PID:" %%a
 )
 rem ps ax | grep -i 'confignode.ConfigNode' | grep -v grep | awk '{print $1}' | xargs kill -SIGTERM
diff --git a/confignode/src/assembly/resources/sbin/stop-confignode.sh b/confignode/src/assembly/resources/sbin/stop-confignode.sh
index 9961ffd623..cce32c5346 100644
--- a/confignode/src/assembly/resources/sbin/stop-confignode.sh
+++ b/confignode/src/assembly/resources/sbin/stop-confignode.sh
@@ -21,6 +21,8 @@
 CONFIGNODE_CONF="$(dirname "$0")/../conf"
 internal_port=$(sed '/^internal_port=/!d;s/.*=//' ${CONFIGNODE_CONF}/iotdb-confignode.properties)
 
+echo "check whether the internal_port is used..., port is" $internal_port
+
 if type lsof >/dev/null 2>&1; then
   PID=$(lsof -t -i:${internal_port} -sTCP:LISTEN)
 elif type netstat >/dev/null 2>&1; then
@@ -37,5 +39,5 @@ if [ -z "$PID" ]; then
   exit 1
 else
   kill -s TERM $PID
-  echo "close ConfigNode"
+  echo "close ConfigNode, PID:" $PID
 fi
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
index 376e1f0caa..41f6ae8d68 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
@@ -52,6 +52,9 @@ public class ConfigNodeConstant {
 
   public static final String REMOVE_DATANODE_PROCESS = "[REMOVE_DATANODE_PROCESS]";
 
+  public static final String IOTDB_FOREGROUND = "iotdb-foreground";
+  public static final String IOTDB_PIDFILE = "iotdb-pidfile";
+
   private ConfigNodeConstant() {
     // empty constructor
   }
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index afc54e913f..f6902a8134 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -48,6 +48,7 @@ import org.apache.iotdb.rpc.TSStatusCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
@@ -83,6 +84,7 @@ public class ConfigNode implements ConfigNodeMBean {
     LOGGER.info("Activating {}...", ConfigNodeConstant.GLOBAL_NAME);
 
     try {
+      processPid();
       // Set up internal services
       setUpInternalServices();
       // Init ConfigManager
@@ -125,6 +127,7 @@ public class ConfigNode implements ConfigNodeMBean {
         // the external service is not provided until Seed-ConfigNode is fully initialized
         setUpRPCService();
         // The initial startup of Seed-ConfigNode finished
+
         LOGGER.info(
             "{} has successfully started and joined the cluster.", ConfigNodeConstant.GLOBAL_NAME);
         return;
@@ -172,6 +175,13 @@ public class ConfigNode implements ConfigNodeMBean {
     }
   }
 
+  void processPid() {
+    String pidFile = System.getProperty(ConfigNodeConstant.IOTDB_PIDFILE);
+    if (pidFile != null) {
+      new File(pidFile).deleteOnExit();
+    }
+  }
+
   private void initConfigManager() {
     try {
       configManager = new ConfigManager();
diff --git a/docs/UserGuide/QuickStart/QuickStart.md b/docs/UserGuide/QuickStart/QuickStart.md
index a12aed4918..2d5da1ba6d 100644
--- a/docs/UserGuide/QuickStart/QuickStart.md
+++ b/docs/UserGuide/QuickStart/QuickStart.md
@@ -64,21 +64,38 @@ Users can start IoTDB by the start-server script under the sbin folder.
 
 ```
 # Unix/OS X
-> nohup sbin/start-server.sh >/dev/null 2>&1 &
+> nohup sbin/start-server.sh -b
+```
 or
-> nohup sbin/start-server.sh -c <conf_path> >/dev/null 2>&1 &
+```shell
+> nohup sbin/start-server.sh >/dev/null 2>&1 &
+```
 
+parameters:
+- by default, iotdb will run in the background
+- "-v": show iotdb version
+- "-f": run iotdb on the foreground and print logs on the console (by default)
+- "-b": run iotdb in the background which does not print logs on the console
+- "-p \<pidfile\>": save the pid into target pidfile
+- "-h": help
+- "printgc"(must be at the end of the command): print the GC log 
+- "-g": print the GC log
+- "-c \<config folder\>": set IOTDB_CONF parameter
+- "-D <a=b>": set system variables to IoTDB program.
+- "-H \<filePath\> save heap dump file to \<filePath\> (only works when iotdb memory <16GB)"
+- "-E <\filePath\> save error file of JVM to \<filePath\>"
+- "-X \<command\> equal to -XX:\<command\>"
+
+```
 # Windows
 > sbin\start-server.bat -c <conf_path>
 ```
 
-- "-c" is optional.
-- option "-c" specifies the system configuration file directory.
-
-if you want to use JMX to connect IOTDB, you may need to add 
+Notice that Windows OS only support -v, -c, -f and -b.
+if you want to use JMX to connect IOTDB, you may need to add/modify 
 
 ```
--Dcom.sun.management.jmxremote.rmi.port=PORT -Djava.rmi.server.hostname=IP 
+-Dcom.sun.management.jmxremote.rmi.port=<PORT> -Djava.rmi.server.hostname=<IP> 
 ```
 to $IOTDB_JMX_OPTS in datanode-env.sh. or datanode-env.bat
 
diff --git a/docs/zh/UserGuide/QuickStart/QuickStart.md b/docs/zh/UserGuide/QuickStart/QuickStart.md
index 44e99d83a6..b2563ae291 100644
--- a/docs/zh/UserGuide/QuickStart/QuickStart.md
+++ b/docs/zh/UserGuide/QuickStart/QuickStart.md
@@ -57,10 +57,24 @@ IoTDB 支持多种安装途径。用户可以使用三种方式对 IoTDB 进行
 Linux 系统与 MacOS 系统启动命令如下:
 
 ```
-> nohup sbin/start-server.sh >/dev/null 2>&1 &
+> nohup sbin/start-server.sh -f >/dev/null 2>&1 &
 or
-> nohup sbin/start-server.sh -c <conf_path> >/dev/null 2>&1 &
-```
+> nohup sbin/start-server.sh -b
+```
+可选参数:
+- 默认不含任何参数时, iotdb 将在后台启动,并且不在控制台打印日志
+- "-v": 查看iotdb版本
+- "-f": 在控制台前台启动iotdb (v0.14前是默认设置)
+- "-b": 在后台启动iotdb,控制台不打印日志
+- "-p \<pidfile\>": 将pid保存到指定的文件中
+- "-h": 查看帮助
+- "printgc"(必须是最后一个参数): 打印GC日志 (从v0.14起,该参数将被-g取代)
+- "-g": 打印GC日志
+- "-c \<config folder\>": 设置IOTDB_CONF变量的值,从而修改配置文件所在文件夹
+- "-D <a=b>": 设置Java的系统环境变量或其他参数
+- "-H \<filePath\> 当OOM异常时存储堆快照到\<filePath\> (仅 Linux/Mac生效, 且要求iotdb内存小于16GB)"
+- "-E <\filePath\> save error file of JVM to \<filePath\> (仅 Linux/Mac生效)"
+- "-X \<command\> 等价于JVM中 -XX:\<command\>"
 
 Windows 系统启动命令如下:
 
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index 624231df5f..d5a26f4982 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -91,6 +91,8 @@ public class IoTDBConstant {
 
   public static final String IOTDB_HOME = "IOTDB_HOME";
 
+  public static final String IOTDB_DATA_HOME = "IOTDB_DATA_HOME";
+
   public static final String SEQFILE_LOG_NODE_SUFFIX = "-seq";
   public static final String UNSEQFILE_LOG_NODE_SUFFIX = "-unseq";
 
@@ -283,6 +285,9 @@ public class IoTDBConstant {
   public static final String NODE_STATUS_RUNNING = "Running";
   public static final String NODE_STATUS_Down = "Down";
 
+  public static final String IOTDB_FOREGROUND = "iotdb-foreground";
+  public static final String IOTDB_PIDFILE = "iotdb-pidfile";
+
   // client version number
   public enum ClientVersion {
     V_0_12,
diff --git a/server/src/assembly/resources/conf/datanode-env.bat b/server/src/assembly/resources/conf/datanode-env.bat
index 7dce041f5b..25fac0736c 100644
--- a/server/src/assembly/resources/conf/datanode-env.bat
+++ b/server/src/assembly/resources/conf/datanode-env.bat
@@ -77,6 +77,11 @@ if %desired_yg_in_mb% GTR %max_sensible_yg_in_mb% (
 	set HEAP_NEWSIZE=%max_sensible_yg_in_mb%M
 ) else set HEAP_NEWSIZE=%desired_yg_in_mb%M
 
+@REM if the heap size is larger than 16GB, we will forbid writing the heap dump file
+if %desired_yg_in_mb% GTR 16384 (
+	set IOTDB_ALLOW_HEAP_DUMP="false"
+) else set IOTDB_ALLOW_HEAP_DUMP="true"
+
 @REM Maximum heap size
 @REM set MAX_HEAP_SIZE="2G"
 @REM Minimum heap size
diff --git a/server/src/assembly/resources/conf/datanode-env.sh b/server/src/assembly/resources/conf/datanode-env.sh
index 8349b80574..a2cfe1dbef 100755
--- a/server/src/assembly/resources/conf/datanode-env.sh
+++ b/server/src/assembly/resources/conf/datanode-env.sh
@@ -57,6 +57,9 @@ case "$(uname)" in
     ;;
 esac
 
+# whether we allow enable heap dump files
+IOTDB_ALLOW_HEAP_DUMP="true"
+
 calculate_heap_sizes()
 {
     case "`uname`" in
@@ -115,6 +118,13 @@ calculate_heap_sizes()
     fi
     MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
 
+    # if the heap size is larger than 16GB, we will forbid writing the heap dump file
+    if [ "$max_heap_size_in_mb" -gt "16384" ]
+    then
+       echo "IoTDB memory is too large ($max_heap_size_in_mb MB), will forbid writing heap dump file"
+       IOTDB_ALLOW_HEAP_DUMP="false"
+    fi
+
     # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
     max_sensible_yg_per_core_in_mb="100"
     max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`
diff --git a/server/src/assembly/resources/conf/logback-tool.xml b/server/src/assembly/resources/conf/logback-tool.xml
index 98f3f9d5c0..7b0e9b8295 100644
--- a/server/src/assembly/resources/conf/logback-tool.xml
+++ b/server/src/assembly/resources/conf/logback-tool.xml
@@ -19,4 +19,18 @@
     under the License.
 
 -->
-<configuration/>
+<configuration scan="true" scanPeriod="60 seconds">
+    <appender class="ch.qos.logback.core.ConsoleAppender" name="stdout">
+        <Target>System.out</Target>
+        <encoder>
+            <pattern>%d [%t] %-5p %C{25}:%L - %m %n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+    </appender>
+    <root level="error">
+        <appender-ref ref="stdout"/>
+    </root>
+</configuration>
diff --git a/server/src/assembly/resources/sbin/iotdb-common.sh b/server/src/assembly/resources/sbin/iotdb-common.sh
new file mode 100755
index 0000000000..05ee3791b0
--- /dev/null
+++ b/server/src/assembly/resources/sbin/iotdb-common.sh
@@ -0,0 +1,130 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+
+# this function is for parsing the variables like "A=B" in  `start-server.sh -D A=B`
+# The command just parse IOTDB-prefixed variables and ignore all other variables
+checkEnvVaribles()
+{
+
+  string="$1"
+  array=$(echo $string | tr '=' ' ')
+  eval set -- "$array"
+  case "$1" in
+          IOTDB_INCLUDE)
+               IOTDB_INCLUDE="$2"
+          ;;
+          IOTDB_HOME)
+               IOTDB_HOME="$2"
+          ;;
+          IOTDB_DATA_HOME)
+             IOTDB_DATA_HOME="$2"
+          ;;
+          IOTDB_CONF)
+             IOTDB_CONF="$2"
+          ;;
+          IOTDB_LOG_DIR)
+             IOTDB_LOG_DIR="$2"
+          ;;
+          IOTDB_LOG_CONFIG)
+             IOTDB_LOG_CONFIG="$2"
+          ;;
+          IOTDB_CLI_CONF)
+             IOTDB_CLI_CONF="$2"
+          ;;
+          *)
+            #we can not process it, so that we return back.
+            echo "$1=$2"
+          ;;
+  esac
+  echo ""
+}
+
+checkAllVariables()
+{
+  if [ -z "${IOTDB_INCLUDE}" ]; then
+    #do nothing
+    :
+  elif [ -r "$IOTDB_INCLUDE" ]; then
+      . "$IOTDB_INCLUDE"
+  fi
+
+  if [ -z "${IOTDB_HOME}" ]; then
+    export IOTDB_HOME="`dirname "$0"`/.."
+  fi
+
+  if [ -z "${IOTDB_DATA_HOME}" ]; then
+    export IOTDB_DATA_HOME=${IOTDB_HOME}
+  fi
+
+  if [ -z "${IOTDB_CONF}" ]; then
+    export IOTDB_CONF=${IOTDB_HOME}/conf
+  fi
+
+  if [ -z "${IOTDB_LOG_DIR}" ]; then
+    export IOTDB_LOG_DIR=${IOTDB_HOME}/logs
+  fi
+
+  if [ -z "${IOTDB_LOG_CONFIG}" ]; then
+    export IOTDB_LOG_CONFIG="${IOTDB_CONF}/logback.xml"
+  fi
+}
+
+initEnv() {
+  if [ -f "$IOTDB_CONF/datanode-env.sh" ]; then
+      if [ "x$PRINT_GC" != "x" ]; then
+        . "$IOTDB_CONF/datanode-env.sh" "printgc"
+      else
+          . "$IOTDB_CONF/datanode-env.sh"
+      fi
+  elif [ -f "${IOTDB_HOME}/conf/datanode-env.sh" ]; then
+      if [ "x$PRINT_GC" != "x" ]; then
+        . "${IOTDB_HOME}/conf/datanode-env.sh" "printgc"
+      else
+        . "${IOTDB_HOME}/conf/datanode-env.sh"
+      fi
+  else
+      echo "can't find $IOTDB_CONF/datanode-env.sh"
+  fi
+}
+
+get_iotdb_include() {
+  #reset $1 to $* for this command
+  eval set -- "$1"
+  VARS=""
+  while true; do
+      case "$1" in
+          -D)
+              VARS="$VARS $(checkEnvVaribles $2)"
+              shift 2
+          ;;
+          "")
+          #if we do not use getopt, we then have to process the case that there is no argument.
+              shift
+              break
+          ;;
+          *)
+              VARS="$VARS $1"
+              shift
+          ;;
+      esac
+  done
+  echo "$VARS"
+}
\ No newline at end of file
diff --git a/server/src/assembly/resources/sbin/remove-datanode.sh b/server/src/assembly/resources/sbin/remove-datanode.sh
index 749a8da0e3..6bb08d25e8 100644
--- a/server/src/assembly/resources/sbin/remove-datanode.sh
+++ b/server/src/assembly/resources/sbin/remove-datanode.sh
@@ -22,51 +22,38 @@ echo ---------------------
 echo "Starting to remove a DataNode"
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/.."
-fi
+source "$(dirname "$0")/iotdb-common.sh"
 
-IOTDB_CONF=${IOTDB_HOME}/conf
+#get_iotdb_include wil remove -D parameters
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
-CONF_PARAMS="-r "$*
+PARAMS="-r "$*
 
-if [ -n "$JAVA_HOME" ]; then
-    for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
-        if [ -x "$java" ]; then
-            JAVA="$java"
-            break
-        fi
-    done
-else
-    JAVA=java
-fi
-
-if [ -z $JAVA ] ; then
-    echo Unable to find java executable. Check JAVA_HOME and PATH environment variables.  > /dev/stderr
-    exit 1;
-fi
-
-if [ -d ${IOTDB_HOME}/lib ]; then
-LIB_PATH=${IOTDB_HOME}/lib
-else
-LIB_PATH=${IOTDB_HOME}/../lib
-fi
+#initEnv is in iotdb-common.sh
+initEnv
 
 CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
+for f in ${IOTDB_HOME}/lib/*.jar; do
   CLASSPATH=${CLASSPATH}":"$f
 done
+
 classname=org.apache.iotdb.db.service.DataNode
 
 launch_service()
 {
 	class="$1"
-	iotdb_parms="-Dlogback.configurationFile=${IOTDB_CONF}/logback-datanode.xml"
+  iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
 	iotdb_parms="$iotdb_parms -DIOTDB_HOME=${IOTDB_HOME}"
+	iotdb_parms="$iotdb_parms -DIOTDB_DATA_HOME=${IOTDB_DATA_HOME}"
 	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${IOTDB_HOME}"
 	iotdb_parms="$iotdb_parms -DIOTDB_CONF=${IOTDB_CONF}"
+	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -Dname=iotdb\.IoTDB"
-	exec "$JAVA" $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
+	iotdb_parms="$iotdb_parms -DIOTDB_LOG_DIR=${IOTDB_LOG_DIR}"
+
+	exec "$JAVA" $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" "$class" $PARAMS
 	return $?
 }
 
diff --git a/server/src/assembly/resources/sbin/start-datanode.bat b/server/src/assembly/resources/sbin/start-datanode.bat
index 58654e7957..b11659a783 100755
--- a/server/src/assembly/resources/sbin/start-datanode.bat
+++ b/server/src/assembly/resources/sbin/start-datanode.bat
@@ -22,6 +22,8 @@ echo ````````````````````````
 echo Starting IoTDB DataNode
 echo ````````````````````````
 
+@REM -----------------------------------------------------------------------------
+@REM SET JAVA
 PATH %PATH%;%JAVA_HOME%\bin\
 set "FULL_VERSION="
 set "MAJOR_VERSION="
@@ -51,7 +53,8 @@ IF "%JAVA_VERSION%" == "7" (
 	goto finally
 )
 
-
+@REM -----------------------------------------------------------------------------
+@REM SET DIR
 if "%OS%" == "Windows_NT" setlocal
 
 pushd %~dp0..
@@ -103,6 +106,7 @@ set JAVA_OPTS=-ea^
  -DTSFILE_CONF="%IOTDB_CONF%"^
  -DIOTDB_CONF="%IOTDB_CONF%"
 
+@REM ----------------------------------------------------------------------------
 @REM ***** CLASSPATH library setting *****
 @REM Ensure that any user defined CLASSPATH variables are not used on startup
 if EXIST %IOTDB_HOME%\lib (set CLASSPATH="%IOTDB_HOME%\lib\*") else set CLASSPATH="%IOTDB_HOME%\..\lib\*"
@@ -120,7 +124,54 @@ goto :eof
 
 rem echo CLASSPATH: %CLASSPATH%
 
-"%JAVA_HOME%\bin\java" %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+@REM ----------------------------------------------------------------------------
+@REM SET PARA
+
+@REM iotdb-server runs in foreground by default
+@REM set foreground=0
+set foreground=yes
+
+:checkPara
+set COMMANSLINE=%*
+@REM setlocal ENABLEDELAYEDEXPANSION
+:STR_VISTOR
+for /f "tokens=1* delims= " %%a in ("%COMMANSLINE%") do (
+@REM -----more para-----
+for /f "tokens=1* delims==" %%1 in ("%%a") do (
+@REM echo 1=%%1 "|||" 2=%%2
+if "%%1"=="-v" ( java %JAVA_OPTS% -Dlogback.configurationFile="%IOTDB_CONF%/logback-tool.xml" -cp %CLASSPATH% org.apache.iotdb.db.service.GetVersion & goto finally )
+if "%%1"=="-f" ( set foreground=yes)
+if "%%1"=="-b" ( set foreground=0)
+)
+set COMMANSLINE=%%b
+goto STR_VISTOR
+)
+
+@REM SETLOCAL DISABLEDELAYEDEXPANSION
+
+echo ````````````````````````
+echo Starting IoTDB
+echo ````````````````````````
+
+@REM ----------------------------------------------------------------------------
+@REM SOURCE iotdb-env.bat
+IF EXIST "%IOTDB_CONF%\iotdb-env.bat" (
+    CALL "%IOTDB_CONF%\iotdb-env.bat" %1
+    ) ELSE (
+    echo "can't find %IOTDB_CONF%\iotdb-env.bat"
+    )
+if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.db.service.IoTDB
+if NOT DEFINED JAVA_HOME goto :err
+
+@REM ----------------------------------------------------------------------------
+@REM START
+:start
+if %foreground%==yes (
+	java %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	) ELSE (
+	start javaw %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	)
+
 goto finally
 
 :err
@@ -130,7 +181,6 @@ pause
 
 @REM -----------------------------------------------------------------------------
 :finally
-
+@ENDLOCAL
 pause
 
-ENDLOCAL
diff --git a/server/src/assembly/resources/sbin/start-datanode.sh b/server/src/assembly/resources/sbin/start-datanode.sh
index 4cc07b7c71..99c626a738 100755
--- a/server/src/assembly/resources/sbin/start-datanode.sh
+++ b/server/src/assembly/resources/sbin/start-datanode.sh
@@ -19,81 +19,168 @@
 #
 
 
-echo ---------------------
-echo "Starting IoTDB DataNode"
-echo ---------------------
+source "$(dirname "$0")/iotdb-common.sh"
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/.."
-fi
+# iotdb server runs on foreground by default
+foreground="yes"
 
-enable_printgc=false
-if [ "$#" -ge "1" -a "$1" == "printgc" ]; then
-  enable_printgc=true;
-  shift
-fi
+IOTDB_HEAP_DUMP_COMMAND=""
 
-IOTDB_CONF=$1
-if [ -z "${IOTDB_CONF}" ]; then
-  export IOTDB_CONF=${IOTDB_HOME}/conf
-fi
+echo "all parameters are $*"
+while true; do
+    case "$1" in
+        -c)
+            IOTDB_CONF="$2"
+            shift 2
+            ;;
+        -p)
+            pidfile="$2"
+            shift 2
+        ;;
+        -f)
+            foreground="yes"
+            shift
+        ;;
+        -b)
+            foreground=""
+            shift
+        ;;
+        -g)
+            PRINT_GC="yes"
+            shift
+        ;;
+        -H)
+            IOTDB_HEAP_DUMP_COMMAND="$IOTDB_HEAP_DUMP_COMMAND -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$2"
+            shift 2
+        ;;
+        -E)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:ErrorFile=$2"
+            shift 2
+        ;;
+        -D)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -D$2"
+            #checkEnvVaribles is in iotdb-common.sh
+            checkEnvVaribles $2
+            shift 2
+        ;;
+        -X)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:$2"
+            shift 2
+        ;;
+        -h)
+            echo "Usage: $0 [-v] [-f] [-b] [-h] [-p pidfile] [-c configFolder] [-H HeapDumpPath] [-E JvmErrorFile] [printgc]"
+            exit 0
+        ;;
+        -v)
+            SHOW_VERSION="yes"
+            break
+        ;;
+        --)
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        "")
+        #if we do not use getopt, we then have to process the case that there is no argument.
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        *)
+            echo "Error parsing arguments! Unknown argument \"$1\"" >&2
+            exit 1
+        ;;
+    esac
+done
 
-if [ -f "$IOTDB_CONF/datanode-env.sh" ]; then
-    if [ $enable_printgc == "true" ]; then
-      . "$IOTDB_CONF/datanode-env.sh" "printgc"
-    else
-        . "$IOTDB_CONF/datanode-env.sh"
-    fi
-elif [ -f "${IOTDB_HOME}/conf/datanode-env.sh" ]; then
-    if [ $enable_printgc == "true" ]; then
-      . "${IOTDB_HOME}/conf/datanode-env.sh" "printgc"
+#checkAllVariables is in iotdb-common.sh
+checkAllVariables
+
+CLASSPATH=""
+for f in ${IOTDB_HOME}/lib/*.jar; do
+  CLASSPATH=${CLASSPATH}":"$f
+done
+
+classname=org.apache.iotdb.db.service.DataNode
+
+
+if [ "x$SHOW_VERSION" != "x" ]; then
+    classname=org.apache.iotdb.db.service.GetVersion
+    IOTDB_LOG_CONFIG="${IOTDB_CONF}/logback-tool.xml"
+    # find java in JAVA_HOME
+    if [ -n "$JAVA_HOME" ]; then
+        for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
+            if [ -x "$java" ]; then
+                JAVA="$java"
+                break
+            fi
+        done
     else
-      . "${IOTDB_HOME}/conf/datanode-env.sh"
+        JAVA=java
     fi
-else
-    echo "can't find $IOTDB_CONF/datanode-env.sh"
+    exec "$JAVA" -cp "$CLASSPATH" $IOTDB_JVM_OPTS "-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}" "$classname"
+    exit 0
 fi
 
-CONF_PARAMS="-s "$*
+echo ---------------------
+echo "Starting IoTDB DataNode"
+echo ---------------------
 
-if [ -n "$JAVA_HOME" ]; then
-    for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
-        if [ -x "$java" ]; then
-            JAVA="$java"
-            break
-        fi
-    done
-else
-    JAVA=java
-fi
+#initEnv is in iotdb-common.sh
+initEnv
 
-if [ -z $JAVA ] ; then
-    echo Unable to find java executable. Check JAVA_HOME and PATH environment variables.  > /dev/stderr
-    exit 1;
+# check whether we can enable heap dump when oom
+if [ "x$IOTDB_ALLOW_HEAP_DUMP" == "xtrue" ]; then
+  IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS $IOTDB_HEAP_DUMP_COMMAND"
 fi
 
-if [ -d ${IOTDB_HOME}/lib ]; then
-LIB_PATH=${IOTDB_HOME}/lib
-else
-LIB_PATH=${IOTDB_HOME}/../lib
-fi
+# -s means start a data node. -r means remove a data node.
+
+PARAMS="-s $PARAMS"
 
-CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
-  CLASSPATH=${CLASSPATH}":"$f
-done
 classname=org.apache.iotdb.db.service.DataNode
 
 launch_service()
 {
 	class="$1"
-	iotdb_parms="-Dlogback.configurationFile=${IOTDB_CONF}/logback-datanode.xml"
+  iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
 	iotdb_parms="$iotdb_parms -DIOTDB_HOME=${IOTDB_HOME}"
+	iotdb_parms="$iotdb_parms -DIOTDB_DATA_HOME=${IOTDB_DATA_HOME}"
 	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${IOTDB_HOME}"
 	iotdb_parms="$iotdb_parms -DIOTDB_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -Dname=iotdb\.IoTDB"
-	exec "$JAVA" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
+	iotdb_parms="$iotdb_parms -DIOTDB_LOG_DIR=${IOTDB_LOG_DIR}"
+
+	  if [ "x$pidfile" != "x" ]; then
+       iotdb_parms="$iotdb_parms -Diotdb-pidfile=$pidfile"
+    fi
+
+  # The iotdb-foreground option will tell IoTDB not to close stdout/stderr, but it's up to us not to background.
+    if [ "x$foreground" == "xyes" ]; then
+        iotdb_parms="$iotdb_parms -Diotdb-foreground=yes"
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+          [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        else
+            [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        fi
+    # Startup IoTDB, background it, and write the pid.
+    else
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+              exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null  <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        else
+              exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        fi
+    fi
+
 	return $?
 }
 
@@ -112,6 +199,7 @@ check_tool_env() {
 }
 
 # convert path to real full-path.
+# e.g., /a/b/c/.. will return /a/b
 # If path has been deleted, return ""
 get_real_path() {
   local path=$1
@@ -132,7 +220,9 @@ check_running_process() {
   for pid in ${PIDS}
   do
     run_conf_path=""
+    # find the abstract path of the process
     run_cwd=$(lsof -p $pid 2>/dev/null | awk '$4~/cwd/ {print $NF}')
+    # find "-DIOTDB_HOME=XXX" from the process command
     run_home_path=$(ps -fp $pid | sed "s/ /\n/g" | sed -n "s/-DIOTDB_HOME=//p")
     run_home_path=$(get_real_path "${run_cwd}/${run_home_path}")
 
diff --git a/server/src/assembly/resources/sbin/start-new-server.bat b/server/src/assembly/resources/sbin/start-new-server.bat
index f11e22647c..344bf353c1 100644
--- a/server/src/assembly/resources/sbin/start-new-server.bat
+++ b/server/src/assembly/resources/sbin/start-new-server.bat
@@ -110,17 +110,58 @@ goto :eof
 
 rem echo CLASSPATH: %CLASSPATH%
 
-"%JAVA_HOME%\bin\java" %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+@REM SET PARA
+
+@REM Before v0.14, iotdb-server runs in foreground by default
+@REM set foreground=0
+set foreground=yes
+
+:checkPara
+set COMMANSLINE=%*
+@REM setlocal ENABLEDELAYEDEXPANSION
+:STR_VISTOR
+for /f "tokens=1* delims= " %%a in ("%COMMANSLINE%") do (
+@REM -----more para-----
+for /f "tokens=1* delims==" %%1 in ("%%a") do (
+@REM echo 1=%%1 "|||" 2=%%2
+if "%%1"=="-v" ( java %JAVA_OPTS% -Dlogback.configurationFile="%IOTDB_CONF%/logback-tool.xml" -cp %CLASSPATH% org.apache.iotdb.db.service.GetVersion & goto finally )
+if "%%1"=="-f" ( set foreground=yes)
+if "%%1"=="-b" ( set foreground=0)
+)
+set COMMANSLINE=%%b
+goto STR_VISTOR
+)
+
+@REM SETLOCAL DISABLEDELAYEDEXPANSION
+
+echo ````````````````````````
+echo Starting IoTDB
+echo ````````````````````````
+
+@REM ----------------------------------------------------------------------------
+@REM SOURCE iotdb-env.bat
+IF EXIST "%IOTDB_CONF%\iotdb-env.bat" (
+    CALL "%IOTDB_CONF%\iotdb-env.bat" %1
+    ) ELSE (
+    echo "can't find %IOTDB_CONF%\iotdb-env.bat"
+    )
+if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.db.service.IoTDB
+if NOT DEFINED JAVA_HOME goto :err
+
+@REM ----------------------------------------------------------------------------
+@REM START
+:start
+if %foreground%==yes (
+	java %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	) ELSE (
+	start javaw %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	)
 goto finally
 
 :err
 echo JAVA_HOME environment variable must be set!
 pause
 
-
-@REM -----------------------------------------------------------------------------
 :finally
-
-pause
-
-ENDLOCAL
+@ENDLOCAL
+pause
\ No newline at end of file
diff --git a/server/src/assembly/resources/sbin/start-new-server.sh b/server/src/assembly/resources/sbin/start-new-server.sh
index ad7ced776d..a6ee38efe5 100644
--- a/server/src/assembly/resources/sbin/start-new-server.sh
+++ b/server/src/assembly/resources/sbin/start-new-server.sh
@@ -18,67 +18,165 @@
 # under the License.
 #
 
+#start-new-server.sh may be deleted in the future, therefore we keep it duplicate with start-datanode.sh
+#except for  classname
+
+source "$(dirname "$0")/iotdb-common.sh"
+
+# iotdb server runs on foreground by default
+foreground="yes"
+
+IOTDB_HEAP_DUMP_COMMAND=""
+
+while true; do
+    case "$1" in
+        -c)
+            IOTDB_CONF="$2"
+            shift 2
+            ;;
+        -p)
+            pidfile="$2"
+            shift 2
+        ;;
+        -f)
+            foreground="yes"
+            shift
+        ;;
+        -b)
+            foreground=""
+            shift
+        ;;
+        -g)
+            PRINT_GC="yes"
+            shift
+        ;;
+        -H)
+            IOTDB_HEAP_DUMP_COMMAND="$IOTDB_HEAP_DUMP_COMMAND -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$2"
+            shift 2
+        ;;
+        -E)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:ErrorFile=$2"
+            shift 2
+        ;;
+        -D)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -D$2"
+            #checkEnvVaribles is in iotdb-common.sh
+            checkEnvVaribles $2
+            shift 2
+        ;;
+        -X)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:$2"
+            shift 2
+        ;;
+        -h)
+            echo "Usage: $0 [-v] [-f] [-b] [-h] [-p pidfile] [-c configFolder] [-H HeapDumpPath] [-E JvmErrorFile] [printgc]"
+            exit 0
+        ;;
+        -v)
+            SHOW_VERSION="yes"
+            break
+        ;;
+        --)
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        "")
+        #if we do not use getopt, we then have to process the case that there is no argument.
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        *)
+            echo "Error parsing arguments! Unknown argument \"$1\"" >&2
+            exit 1
+        ;;
+    esac
+done
 
-echo ---------------------
-echo Starting IoTDB
-echo ---------------------
+#checkAllVariables is in iotdb-common.sh
+checkAllVariables
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/.."
-fi
+CLASSPATH=""
+for f in ${IOTDB_HOME}/lib/*.jar; do
+  CLASSPATH=${CLASSPATH}":"$f
+done
 
-IOTDB_CONF=${IOTDB_HOME}/conf
-# IOTDB_LOGS=${IOTDB_HOME}/logs
 
-is_conf_path=false
-for arg do
-  shift
-  if [ "$arg" == "-c" ]; then
-    is_conf_path=true
-    continue
-  fi
-  if [ $is_conf_path == true ]; then
-    IOTDB_CONF=$arg
-    is_conf_path=false
-    continue
-  fi
-  set -- "$@" "$arg"
-done
 
-CONF_PARAMS=$*
+classname=org.apache.iotdb.db.service.NewIoTDB
 
-if [ -f "$IOTDB_CONF/datanode-env.sh" ]; then
-    if [ "$#" -ge "1" -a "$1" == "printgc" ]; then
-      . "$IOTDB_CONF/datanode-env.sh" "printgc"
+if [ "x$SHOW_VERSION" != "x" ]; then
+    classname=org.apache.iotdb.db.service.GetVersion
+    IOTDB_LOG_CONFIG="${IOTDB_CONF}/logback-tool.xml"
+    # find java in JAVA_HOME
+    if [ -n "$JAVA_HOME" ]; then
+        for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
+            if [ -x "$java" ]; then
+                JAVA="$java"
+                break
+            fi
+        done
     else
-        . "$IOTDB_CONF/datanode-env.sh"
+        JAVA=java
     fi
-else
-    echo "can't find $IOTDB_CONF/datanode-env.sh"
+    exec "$JAVA" -cp "$CLASSPATH" $IOTDB_JVM_OPTS "-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}" "$classname"
+    exit 0
 fi
 
-if [ -d ${IOTDB_HOME}/lib ]; then
-LIB_PATH=${IOTDB_HOME}/lib
-else
-LIB_PATH=${IOTDB_HOME}/../lib
-fi
+echo ---------------------
+echo "Starting IoTDB"
+echo ---------------------
 
-CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
-  CLASSPATH=${CLASSPATH}":"$f
-done
-classname=org.apache.iotdb.db.service.NewIoTDB
+#initEnv is in iotdb-common.sh
+initEnv
+
+# check whether we can enable heap dump when oom
+if [ "x$IOTDB_ALLOW_HEAP_DUMP" == "xtrue" ]; then
+  IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS $IOTDB_HEAP_DUMP_COMMAND"
+fi
 
 launch_service()
 {
 	class="$1"
-	iotdb_parms="-Dlogback.configurationFile=${IOTDB_CONF}/logback-datanode.xml"
+  iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
 	iotdb_parms="$iotdb_parms -DIOTDB_HOME=${IOTDB_HOME}"
+	iotdb_parms="$iotdb_parms -DIOTDB_DATA_HOME=${IOTDB_DATA_HOME}"
 	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${IOTDB_HOME}"
 	iotdb_parms="$iotdb_parms -DIOTDB_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${IOTDB_CONF}"
-	iotdb_parms="$iotdb_parms -Dname=iotdb\.NewIoTDB"
-	exec "$JAVA" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
+	iotdb_parms="$iotdb_parms -Dname=iotdb\.IoTDB"
+	iotdb_parms="$iotdb_parms -DIOTDB_LOG_DIR=${IOTDB_LOG_DIR}"
+
+	  if [ "x$pidfile" != "x" ]; then
+       iotdb_parms="$iotdb_parms -Diotdb-pidfile=$pidfile"
+    fi
+
+  # The iotdb-foreground option will tell IoTDB not to close stdout/stderr, but it's up to us not to background.
+    if [ "x$foreground" == "xyes" ]; then
+        iotdb_parms="$iotdb_parms -Diotdb-foreground=yes"
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+          [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        else
+            [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        fi
+    # Startup IoTDB, background it, and write the pid.
+    else
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+              exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null  <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        else
+              exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        fi
+    fi
+
 	return $?
 }
 
diff --git a/server/src/assembly/resources/sbin/start-server.bat b/server/src/assembly/resources/sbin/start-server.bat
index 8b6dea7896..78cca66635 100755
--- a/server/src/assembly/resources/sbin/start-server.bat
+++ b/server/src/assembly/resources/sbin/start-server.bat
@@ -22,7 +22,8 @@ echo ````````````````````````
 echo Starting IoTDB
 echo ````````````````````````
 
-
+@REM -----------------------------------------------------------------------------
+@REM SET JAVA
 set PATH="%JAVA_HOME%\bin\";%PATH%
 set "FULL_VERSION="
 set "MAJOR_VERSION="
@@ -52,6 +53,8 @@ IF "%JAVA_VERSION%" == "7" (
 	goto finally
 )
 
+@REM -----------------------------------------------------------------------------
+@REM SET DIR
 if "%OS%" == "Windows_NT" setlocal
 
 pushd %~dp0..
@@ -94,6 +97,7 @@ set JAVA_OPTS=-ea^
  -Dsun.jnu.encoding=UTF-8^
  -Dfile.encoding=UTF-8
 
+@REM ----------------------------------------------------------------------------
 @REM ***** CLASSPATH library setting *****
 @REM Ensure that any user defined CLASSPATH variables are not used on startup
 if EXIST %IOTDB_HOME%\lib (set CLASSPATH="%IOTDB_HOME%\lib\*") else set CLASSPATH="%IOTDB_HOME%\..\lib\*"
@@ -110,7 +114,54 @@ goto :eof
 
 rem echo CLASSPATH: %CLASSPATH%
 
-"%JAVA_HOME%\bin\java" %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+@REM ----------------------------------------------------------------------------
+@REM SET PARA
+
+@REM Before v0.14, iotdb-server runs in foreground by default
+@REM set foreground=0
+set foreground=yes
+
+:checkPara
+set COMMANSLINE=%*
+@REM setlocal ENABLEDELAYEDEXPANSION
+:STR_VISTOR
+for /f "tokens=1* delims= " %%a in ("%COMMANSLINE%") do (
+@REM -----more para-----
+for /f "tokens=1* delims==" %%1 in ("%%a") do (
+@REM echo 1=%%1 "|||" 2=%%2
+if "%%1"=="-v" ( java %JAVA_OPTS% -Dlogback.configurationFile="%IOTDB_CONF%/logback-tool.xml" -cp %CLASSPATH% org.apache.iotdb.db.service.GetVersion & goto finally )
+if "%%1"=="-f" ( set foreground=yes)
+if "%%1"=="-b" ( set foreground=0)
+)
+set COMMANSLINE=%%b
+goto STR_VISTOR
+)
+
+@REM SETLOCAL DISABLEDELAYEDEXPANSION
+
+echo ````````````````````````
+echo Starting IoTDB
+echo ````````````````````````
+
+@REM ----------------------------------------------------------------------------
+@REM SOURCE iotdb-env.bat
+IF EXIST "%IOTDB_CONF%\iotdb-env.bat" (
+    CALL "%IOTDB_CONF%\iotdb-env.bat" %1
+    ) ELSE (
+    echo "can't find %IOTDB_CONF%\iotdb-env.bat"
+    )
+if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.db.service.IoTDB
+if NOT DEFINED JAVA_HOME goto :err
+
+@REM ----------------------------------------------------------------------------
+@REM START
+:start
+if %foreground%==yes (
+	java %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	) ELSE (
+	start javaw %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %IOTDB_HEAP_OPTS% -cp %CLASSPATH% %IOTDB_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
+	)
+
 goto finally
 
 :err
@@ -120,7 +171,7 @@ pause
 
 @REM -----------------------------------------------------------------------------
 :finally
+@ENDLOCAL
 
 pause
 
-ENDLOCAL
diff --git a/server/src/assembly/resources/sbin/start-server.sh b/server/src/assembly/resources/sbin/start-server.sh
index a353fa1e4b..41844f0cff 100755
--- a/server/src/assembly/resources/sbin/start-server.sh
+++ b/server/src/assembly/resources/sbin/start-server.sh
@@ -18,67 +18,165 @@
 # under the License.
 #
 
+#start-server.sh may be deleted in the future, therefore we keep it duplicate with start-datanode.sh
+#except for  classname
+
+source "$(dirname "$0")/iotdb-common.sh"
+
+# iotdb server runs on foreground by default
+foreground="yes"
+
+IOTDB_HEAP_DUMP_COMMAND=""
+
+while true; do
+    case "$1" in
+        -c)
+            IOTDB_CONF="$2"
+            shift 2
+            ;;
+        -p)
+            pidfile="$2"
+            shift 2
+        ;;
+        -f)
+            foreground="yes"
+            shift
+        ;;
+        -b)
+            foreground=""
+            shift
+        ;;
+        -g)
+            PRINT_GC="yes"
+            shift
+        ;;
+        -H)
+            IOTDB_HEAP_DUMP_COMMAND="$IOTDB_HEAP_DUMP_COMMAND -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$2"
+            shift 2
+        ;;
+        -E)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:ErrorFile=$2"
+            shift 2
+        ;;
+        -D)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -D$2"
+            #checkEnvVaribles is in iotdb-common.sh
+            checkEnvVaribles $2
+            shift 2
+        ;;
+        -X)
+            IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -XX:$2"
+            shift 2
+        ;;
+        -h)
+            echo "Usage: $0 [-v] [-f] [-b] [-h] [-p pidfile] [-c configFolder] [-H HeapDumpPath] [-E JvmErrorFile] [printgc]"
+            exit 0
+        ;;
+        -v)
+            SHOW_VERSION="yes"
+            break
+        ;;
+        --)
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        "")
+        #if we do not use getopt, we then have to process the case that there is no argument.
+            shift
+            #all others are args to the program
+            PARAMS=$*
+            break
+        ;;
+        *)
+            echo "Error parsing arguments! Unknown argument \"$1\"" >&2
+            exit 1
+        ;;
+    esac
+done
 
-echo ---------------------
-echo Starting IoTDB
-echo ---------------------
+#checkAllVariables is in iotdb-common.sh
+checkAllVariables
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/.."
-fi
+CLASSPATH=""
+for f in ${IOTDB_HOME}/lib/*.jar; do
+  CLASSPATH=${CLASSPATH}":"$f
+done
 
-IOTDB_CONF=${IOTDB_HOME}/conf
-# IOTDB_LOGS=${IOTDB_HOME}/logs
 
-is_conf_path=false
-for arg do
-  shift
-  if [ "$arg" == "-c" ]; then
-    is_conf_path=true
-    continue
-  fi
-  if [ $is_conf_path == true ]; then
-    IOTDB_CONF=$arg
-    is_conf_path=false
-    continue
-  fi
-  set -- "$@" "$arg"
-done
 
-CONF_PARAMS=$*
+classname=org.apache.iotdb.db.service.IoTDB
 
-if [ -f "$IOTDB_CONF/datanode-env.sh" ]; then
-    if [ "$#" -ge "1" -a "$1" == "printgc" ]; then
-      . "$IOTDB_CONF/datanode-env.sh" "printgc"
+if [ "x$SHOW_VERSION" != "x" ]; then
+    classname=org.apache.iotdb.db.service.GetVersion
+    IOTDB_LOG_CONFIG="${IOTDB_CONF}/logback-tool.xml"
+    # find java in JAVA_HOME
+    if [ -n "$JAVA_HOME" ]; then
+        for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
+            if [ -x "$java" ]; then
+                JAVA="$java"
+                break
+            fi
+        done
     else
-        . "$IOTDB_CONF/datanode-env.sh"
+        JAVA=java
     fi
-else
-    echo "can't find $IOTDB_CONF/datanode-env.sh"
+    exec "$JAVA" -cp "$CLASSPATH" $IOTDB_JVM_OPTS "-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}" "$classname"
+    exit 0
 fi
 
-if [ -d ${IOTDB_HOME}/lib ]; then
-LIB_PATH=${IOTDB_HOME}/lib
-else
-LIB_PATH=${IOTDB_HOME}/../lib
-fi
+echo ---------------------
+echo "Starting IoTDB"
+echo ---------------------
 
-CLASSPATH=""
-for f in ${LIB_PATH}/*.jar; do
-  CLASSPATH=${CLASSPATH}":"$f
-done
-classname=org.apache.iotdb.db.service.IoTDB
+#initEnv is in iotdb-common.sh
+initEnv
+
+# check whether we can enable heap dump when oom
+if [ "x$IOTDB_ALLOW_HEAP_DUMP" == "xtrue" ]; then
+  IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS $IOTDB_HEAP_DUMP_COMMAND"
+fi
 
 launch_service()
 {
 	class="$1"
-	iotdb_parms="-Dlogback.configurationFile=${IOTDB_CONF}/logback-datanode.xml"
+  iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}"
 	iotdb_parms="$iotdb_parms -DIOTDB_HOME=${IOTDB_HOME}"
+	iotdb_parms="$iotdb_parms -DIOTDB_DATA_HOME=${IOTDB_DATA_HOME}"
 	iotdb_parms="$iotdb_parms -DTSFILE_HOME=${IOTDB_HOME}"
 	iotdb_parms="$iotdb_parms -DIOTDB_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -DTSFILE_CONF=${IOTDB_CONF}"
 	iotdb_parms="$iotdb_parms -Dname=iotdb\.IoTDB"
-	exec "$JAVA" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" "$class" $CONF_PARAMS
+	iotdb_parms="$iotdb_parms -DIOTDB_LOG_DIR=${IOTDB_LOG_DIR}"
+
+	  if [ "x$pidfile" != "x" ]; then
+       iotdb_parms="$iotdb_parms -Diotdb-pidfile=$pidfile"
+    fi
+
+  # The iotdb-foreground option will tell IoTDB not to close stdout/stderr, but it's up to us not to background.
+    if [ "x$foreground" == "xyes" ]; then
+        iotdb_parms="$iotdb_parms -Diotdb-foreground=yes"
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+          [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        else
+            [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+            exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS
+        fi
+    # Startup IoTDB, background it, and write the pid.
+    else
+        if [ "x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" != "x" ]; then
+              exec $NUMACTL "$JAVA" $JVM_OPTS "$JVM_ON_OUT_OF_MEMORY_ERROR_OPT" $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null  <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        else
+              exec $NUMACTL "$JAVA" $JVM_OPTS $illegal_access_params $iotdb_parms $IOTDB_JMX_OPTS -cp "$CLASSPATH" $IOTDB_JVM_OPTS "$class" $PARAMS 2>&1 > /dev/null <&- &
+              [ ! -z "$pidfile" ] && printf "%d" $! > "$pidfile"
+              true
+        fi
+    fi
+
 	return $?
 }
 
diff --git a/server/src/assembly/resources/sbin/stop-datanode.bat b/server/src/assembly/resources/sbin/stop-datanode.bat
index fe9417158b..866ddeb16d 100644
--- a/server/src/assembly/resources/sbin/stop-datanode.bat
+++ b/server/src/assembly/resources/sbin/stop-datanode.bat
@@ -27,6 +27,8 @@ for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "^rpc_port"
   set rpc_port=%%i
 )
 
+echo "check whether the rpc_port is used..., port is " %rpc_port%
+
 for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "rpc_address"
 %superior_dir%\conf\iotdb-datanode.properties') do (
   set rpc_address=%%i
@@ -34,5 +36,6 @@ for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "rpc_address"
 
 for /f "tokens=5" %%a in ('netstat /ano ^| findstr %rpc_address%:%rpc_port%') do (
   taskkill /f /pid %%a
+  echo "close DataNode, PID:" %%a
 )
 rem ps ax | grep -i 'iotdb.DataNode' | grep -v grep | awk '{print $1}' | xargs kill -SIGTERM
diff --git a/server/src/assembly/resources/sbin/stop-datanode.sh b/server/src/assembly/resources/sbin/stop-datanode.sh
index 8dbf1d67fb..95ba7c9224 100644
--- a/server/src/assembly/resources/sbin/stop-datanode.sh
+++ b/server/src/assembly/resources/sbin/stop-datanode.sh
@@ -21,6 +21,8 @@
 DATANODE_CONF="`dirname "$0"`/../conf"
 rpc_port=`sed '/^rpc_port=/!d;s/.*=//' ${DATANODE_CONF}/iotdb-datanode.properties`
 
+echo "check whether the rpc_port is used..., port is" $rpc_port
+
 if  type lsof > /dev/null 2>&1 ; then
   PID=$(lsof -t -i:${rpc_port} -sTCP:LISTEN)
 elif type netstat > /dev/null 2>&1 ; then
@@ -38,7 +40,7 @@ if [ -z "$PID" ]; then
   exit 1
 elif [[ "${PIDS}" =~ "${PID}" ]]; then
   kill -s TERM $PID
-  echo "Stop DataNode"
+  echo "Stop DataNode, PID:" $PID
 else
   echo "No DataNode to stop"
   exit 1
diff --git a/server/src/assembly/resources/tools/detect-watermark.sh b/server/src/assembly/resources/tools/detect-watermark.sh
index 55ee55a3cb..97b3706d6a 100644
--- a/server/src/assembly/resources/tools/detect-watermark.sh
+++ b/server/src/assembly/resources/tools/detect-watermark.sh
@@ -18,11 +18,12 @@
 # under the License.
 #
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
-IOTDB_CONF=${IOTDB_HOME}/conf
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/schema/SchemaFileSketcher.sh b/server/src/assembly/resources/tools/schema/SchemaFileSketcher.sh
index 7aedb94123..0692993472 100644
--- a/server/src/assembly/resources/tools/schema/SchemaFileSketcher.sh
+++ b/server/src/assembly/resources/tools/schema/SchemaFileSketcher.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Starting Sketching the IoTDB SchemaFile
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/schema/mLogParser.sh b/server/src/assembly/resources/tools/schema/mLogParser.sh
index ddc5352ee4..0b8d4b8bee 100644
--- a/server/src/assembly/resources/tools/schema/mLogParser.sh
+++ b/server/src/assembly/resources/tools/schema/mLogParser.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Starting Parsing the IoTDB Mlog or Snapshot
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/start-WalChecker.sh b/server/src/assembly/resources/tools/start-WalChecker.sh
index d02b8e49d0..c5ab3ca989 100755
--- a/server/src/assembly/resources/tools/start-WalChecker.sh
+++ b/server/src/assembly/resources/tools/start-WalChecker.sh
@@ -23,11 +23,12 @@ echo ---------------------
 echo Starting WalChecker 
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/.."
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
-IOTDB_CONF=${IOTDB_HOME}/conf
 # IOTDB_LOGS=${IOTDB_HOME}/logs
 
 #if [ -f "$IOTDB_CONF/datanode-env.sh" ]; then
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/print-iotdb-data-dir.sh b/server/src/assembly/resources/tools/tsfileToolSet/print-iotdb-data-dir.sh
index 687690fe7c..a9a98a6de5 100644
--- a/server/src/assembly/resources/tools/tsfileToolSet/print-iotdb-data-dir.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/print-iotdb-data-dir.sh
@@ -22,9 +22,12 @@ echo ---------------------
 echo Starting Printing the IoTDB Data Directory Overview
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
+
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-resource-files.sh b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-resource-files.sh
index 31cd8eab49..312d009d2a 100755
--- a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-resource-files.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-resource-files.sh
@@ -23,11 +23,11 @@ echo ---------------------
 echo Starting Printing the TsFileResources
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="`dirname "$0"`/../.."
-fi
-
-IOTDB_CONF=${IOTDB_HOME}/conf
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 
 if [ -n "$JAVA_HOME" ]; then
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-sketch.sh b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-sketch.sh
index 7d10136b4b..90907f223f 100755
--- a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-sketch.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-sketch.sh
@@ -22,9 +22,12 @@ echo ---------------------
 echo Starting Printing the TsFile Sketch
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
+
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-visdata.sh b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-visdata.sh
index 28b124117e..2d9593f746 100644
--- a/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-visdata.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/print-tsfile-visdata.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Starting Printing the TsFile Sketch
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/settle.sh b/server/src/assembly/resources/tools/tsfileToolSet/settle.sh
index 0deea5d01a..c08829fbfe 100644
--- a/server/src/assembly/resources/tools/tsfileToolSet/settle.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/settle.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Starting Settling the TsFile
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/split-tsfile-tool.sh b/server/src/assembly/resources/tools/tsfileToolSet/split-tsfile-tool.sh
index 55133cb6dc..91a11835b9 100644
--- a/server/src/assembly/resources/tools/tsfileToolSet/split-tsfile-tool.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/split-tsfile-tool.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Start Splitting TsFile
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/resources/tools/tsfileToolSet/validate-tsfile.sh b/server/src/assembly/resources/tools/tsfileToolSet/validate-tsfile.sh
index b32b4021dc..dd52d2a4f9 100644
--- a/server/src/assembly/resources/tools/tsfileToolSet/validate-tsfile.sh
+++ b/server/src/assembly/resources/tools/tsfileToolSet/validate-tsfile.sh
@@ -22,9 +22,11 @@ echo ---------------------
 echo Starting Validating the TsFile
 echo ---------------------
 
-if [ -z "${IOTDB_HOME}" ]; then
-  export IOTDB_HOME="$(cd "`dirname "$0"`"/../..; pwd)"
-fi
+source "$(dirname "$0")/iotdb-common.sh"
+#get_iotdb_include and checkAllVariables is in iotdb-common.sh
+VARS=$(get_iotdb_include "$*")
+checkAllVariables
+eval set -- "$VARS"
 
 if [ -n "$JAVA_HOME" ]; then
     for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do
diff --git a/server/src/assembly/server.xml b/server/src/assembly/server.xml
index d730398f9f..16156c09a4 100644
--- a/server/src/assembly/server.xml
+++ b/server/src/assembly/server.xml
@@ -46,5 +46,18 @@
             <source>${maven.multiModuleProjectDirectory}/node-commons/src/assembly/resources/conf/iotdb-common.properties</source>
             <destName>conf/iotdb-common.properties</destName>
         </file>
+        <!-- copy iotdb-common.sh to different script folders-->
+        <file>
+            <source>src/assembly/resources/sbin/iotdb-common.sh</source>
+            <destName>tools/iotdb-common.sh</destName>
+        </file>
+        <file>
+            <source>src/assembly/resources/sbin/iotdb-common.sh</source>
+            <destName>tools/tsfileToolSet/iotdb-common.sh</destName>
+        </file>
+        <file>
+            <source>src/assembly/resources/sbin/iotdb-common.sh</source>
+            <destName>tools/schema/iotdb-common.sh</destName>
+        </file>
     </files>
 </assembly>
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 9fc9eb0f26..61801bcc5a 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -1152,24 +1152,24 @@ public class IoTDBConfig {
     confirmMultiDirStrategy();
   }
 
-  /** if the folders are relative paths, add IOTDB_HOME as the path prefix */
+  /** if the folders are relative paths, add IOTDB_DATA_HOME as the path prefix */
   private void formulateFolders() {
-    systemDir = addHomeDir(systemDir);
-    schemaDir = addHomeDir(schemaDir);
-    loadTsFileDir = addHomeDir(loadTsFileDir);
-    tracingDir = addHomeDir(tracingDir);
-    consensusDir = addHomeDir(consensusDir);
-    dataRegionConsensusDir = addHomeDir(dataRegionConsensusDir);
-    schemaRegionConsensusDir = addHomeDir(schemaRegionConsensusDir);
-    indexRootFolder = addHomeDir(indexRootFolder);
-    extDir = addHomeDir(extDir);
-    udfDir = addHomeDir(udfDir);
-    udfTemporaryLibDir = addHomeDir(udfTemporaryLibDir);
-    triggerDir = addHomeDir(triggerDir);
-    triggerTemporaryLibDir = addHomeDir(triggerTemporaryLibDir);
-    mqttDir = addHomeDir(mqttDir);
-
-    extPipeDir = addHomeDir(extPipeDir);
+    systemDir = addDataHomeDir(systemDir);
+    schemaDir = addDataHomeDir(schemaDir);
+    loadTsFileDir = addDataHomeDir(loadTsFileDir);
+    tracingDir = addDataHomeDir(tracingDir);
+    consensusDir = addDataHomeDir(consensusDir);
+    dataRegionConsensusDir = addDataHomeDir(dataRegionConsensusDir);
+    schemaRegionConsensusDir = addDataHomeDir(schemaRegionConsensusDir);
+    indexRootFolder = addDataHomeDir(indexRootFolder);
+    extDir = addDataHomeDir(extDir);
+    udfDir = addDataHomeDir(udfDir);
+    udfTemporaryLibDir = addDataHomeDir(udfTemporaryLibDir);
+    triggerDir = addDataHomeDir(triggerDir);
+    triggerTemporaryLibDir = addDataHomeDir(triggerTemporaryLibDir);
+    mqttDir = addDataHomeDir(mqttDir);
+
+    extPipeDir = addDataHomeDir(extPipeDir);
 
     if (TSFileDescriptor.getInstance().getConfig().getTSFileStorageFs().equals(FSType.HDFS)) {
       String hdfsDir = getHdfsDir();
@@ -1178,9 +1178,9 @@ public class IoTDBConfig {
         dataDirs[i] = hdfsDir + File.separatorChar + dataDirs[i];
       }
     } else {
-      queryDir = addHomeDir(queryDir);
+      queryDir = addDataHomeDir(queryDir);
       for (int i = 0; i < dataDirs.length; i++) {
-        dataDirs[i] = addHomeDir(dataDirs[i]);
+        dataDirs[i] = addDataHomeDir(dataDirs[i]);
       }
     }
   }
@@ -1194,7 +1194,7 @@ public class IoTDBConfig {
       }
     } else {
       for (int i = 0; i < dataDirs.length; i++) {
-        dataDirs[i] = addHomeDir(dataDirs[i]);
+        dataDirs[i] = addDataHomeDir(dataDirs[i]);
       }
     }
     // make sure old data directories not removed
@@ -1211,13 +1211,26 @@ public class IoTDBConfig {
     DirectoryManager.getInstance().updateFileFolders();
   }
 
-  private String addHomeDir(String dir) {
-    String homeDir = System.getProperty(IoTDBConstant.IOTDB_HOME, null);
-    if (!new File(dir).isAbsolute() && homeDir != null && homeDir.length() > 0) {
-      if (!homeDir.endsWith(File.separator)) {
-        dir = homeDir + File.separatorChar + dir;
+  //  private String addHomeDir(String dir) {
+  //    return addDirPrefix(System.getProperty(IoTDBConstant.IOTDB_HOME, null), dir);
+  //  }
+
+  // if IOTDB_DATA_HOME is not set, then we keep dataHomeDir prefix being the same with IOTDB_HOME
+  // In this way, we can keep consistent with v0.13.0~2.
+  private String addDataHomeDir(String dir) {
+    String dataHomeDir = System.getProperty(IoTDBConstant.IOTDB_DATA_HOME, null);
+    if (dataHomeDir == null) {
+      dataHomeDir = System.getProperty(IoTDBConstant.IOTDB_HOME, null);
+    }
+    return addDirPrefix(dataHomeDir, dir);
+  }
+
+  private String addDirPrefix(String prefix, String dir) {
+    if (!new File(dir).isAbsolute() && prefix != null && prefix.length() > 0) {
+      if (!prefix.endsWith(File.separator)) {
+        dir = prefix + File.separatorChar + dir;
       } else {
-        dir = homeDir + dir;
+        dir = prefix + dir;
       }
     }
     return dir;
diff --git a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
index 7df904a82b..6a11052843 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java
@@ -83,6 +83,7 @@ import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -281,6 +282,7 @@ public class DataNode implements DataNodeMBean {
   /** register services and set up DataNode */
   private void active() throws StartupException {
     try {
+      processPid();
       setUp();
     } catch (StartupException | QueryProcessException e) {
       logger.error("Meet error while starting up.", e);
@@ -297,6 +299,13 @@ public class DataNode implements DataNodeMBean {
     }
   }
 
+  void processPid() {
+    String pidFile = System.getProperty(IoTDBConstant.IOTDB_PIDFILE);
+    if (pidFile != null) {
+      new File(pidFile).deleteOnExit();
+    }
+  }
+
   private void setUp() throws StartupException, QueryProcessException {
     logger.info("Setting up IoTDB DataNode...");
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/GetVersion.java b/server/src/main/java/org/apache/iotdb/db/service/GetVersion.java
new file mode 100644
index 0000000000..8b49874460
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/service/GetVersion.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.service;
+
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+
+public class GetVersion {
+  public static void main(String[] args) {
+    System.out.println(IoTDBDescriptor.getInstance().getConfig().getIoTDBVersion());
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index 8b9c57d783..2015d04f96 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -54,6 +54,7 @@ import org.apache.iotdb.db.wal.WALManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 
 public class IoTDB implements IoTDBMBean {
@@ -93,6 +94,7 @@ public class IoTDB implements IoTDBMBean {
   }
 
   public void active() {
+    processPid();
     StartupChecks checks = new StartupChecks().withDefaultTest();
     try {
       checks.verify();
@@ -122,9 +124,17 @@ public class IoTDB implements IoTDBMBean {
     config.setAutoCreateSchemaEnabled(prevIsAutoCreateSchemaEnabled);
     config.setEnablePartialInsert(prevIsEnablePartialInsert);
 
+    processPid();
     logger.info("{} has started.", IoTDBConstant.GLOBAL_DB_NAME);
   }
 
+  void processPid() {
+    String pidFile = System.getProperty(IoTDBConstant.IOTDB_PIDFILE);
+    if (pidFile != null) {
+      new File(pidFile).deleteOnExit();
+    }
+  }
+
   private void setUp() throws StartupException, QueryProcessException {
     logger.info("Setting up IoTDB...");
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/NewIoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/NewIoTDB.java
index 86d4f2840b..d9e803ce04 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/NewIoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/NewIoTDB.java
@@ -54,6 +54,7 @@ import org.apache.iotdb.db.wal.WALManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
 import java.io.IOException;
 
 public class NewIoTDB implements NewIoTDBMBean {
@@ -87,6 +88,7 @@ public class NewIoTDB implements NewIoTDBMBean {
   }
 
   public void active() {
+    processPid();
     StartupChecks checks = new StartupChecks().withDefaultTest();
     try {
       checks.verify();
@@ -112,6 +114,13 @@ public class NewIoTDB implements NewIoTDBMBean {
     logger.info("{} has started.", IoTDBConstant.GLOBAL_DB_NAME);
   }
 
+  void processPid() {
+    String pidFile = System.getProperty(IoTDBConstant.IOTDB_PIDFILE);
+    if (pidFile != null) {
+      new File(pidFile).deleteOnExit();
+    }
+  }
+
   private void setUp() throws StartupException, QueryProcessException {
     logger.info("Setting up IoTDB...");
 
diff --git a/server/src/test/java/org/apache/iotdb/db/service/DaemonTest.java b/server/src/test/java/org/apache/iotdb/db/service/DaemonTest.java
new file mode 100644
index 0000000000..dea26b34c2
--- /dev/null
+++ b/server/src/test/java/org/apache/iotdb/db/service/DaemonTest.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.service;
+
+import org.junit.Test;
+
+public class DaemonTest {
+
+  @Test
+  public void testPid() {
+    IoTDB ioTDB = IoTDB.getInstance();
+    // no pid set, so there is nothing happens
+    ioTDB.processPid();
+  }
+
+  @Test
+  public void testSetPid() {
+    IoTDB ioTDB = IoTDB.getInstance();
+    System.setProperty("iotdb-pidfile", "./iotdb.pid");
+    // no pid set, so there is nothing happens
+    ioTDB.processPid();
+  }
+}