This is an automated email from the ASF dual-hosted git repository. hxd pushed a commit to branch 4230-2-0.13 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 84a49f89f0f9f582b85ea62c34774e3b62452688 Author: xiangdong huang <[email protected]> AuthorDate: Sun Aug 28 19:15:18 2022 +0800 add -p pid, -v version feature --- docs/UserGuide/QuickStart/QuickStart.md | 24 ++-- docs/zh/UserGuide/QuickStart/QuickStart.md | 16 ++- .../src/assembly/resources/conf/logback-tool.xml | 16 ++- server/src/assembly/resources/sbin/start-server.sh | 150 ++++++++++++++++----- server/src/assembly/resources/sbin/stop-server.bat | 3 + server/src/assembly/resources/sbin/stop-server.sh | 4 +- .../org/apache/iotdb/db/conf/IoTDBConstant.java | 3 + .../org/apache/iotdb/db/service/GetVersion.java | 27 ++++ .../java/org/apache/iotdb/db/service/IoTDB.java | 10 ++ .../org/apache/iotdb/db/service/DaemonTest.java | 41 ++++++ 10 files changed, 250 insertions(+), 44 deletions(-) diff --git a/docs/UserGuide/QuickStart/QuickStart.md b/docs/UserGuide/QuickStart/QuickStart.md index 103587bd06..1a51764128 100644 --- a/docs/UserGuide/QuickStart/QuickStart.md +++ b/docs/UserGuide/QuickStart/QuickStart.md @@ -64,23 +64,29 @@ 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 -f or -> nohup sbin/start-server.sh -c <conf_path> -rpc_port <rpc_port> >/dev/null 2>&1 & +> nohup sbin/start-server.sh # Windows -> sbin\start-server.bat -c <conf_path> -rpc_port <rpc_port> +> sbin\start-server.bat ``` -- "-c" and "-rpc_port" are optional. -- option "-c" specifies the system configuration file directory. -- option "-rpc_port" specifies the rpc port. -- if both option specified, the *rpc_port* will overrides the rpc_port in *conf_path*. +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 +- "-p \<pidfile\>": save the pid into target pidfile +- "-h": help +- "printgc"(must be at the end of the command): print the GC log (deprecated from v0.14 on) +- "-g": print the GC log +- "-c \<config folder\>": set IOTDB_CONF parameter +- "-D <a=b>": set system variables to IoTDB program. -if you want to use JMX to connect IOTDB, you may need to add +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 iotdb-env.sh. or iotdb-env.bat diff --git a/docs/zh/UserGuide/QuickStart/QuickStart.md b/docs/zh/UserGuide/QuickStart/QuickStart.md index 983766d6da..6d39c45180 100644 --- a/docs/zh/UserGuide/QuickStart/QuickStart.md +++ b/docs/zh/UserGuide/QuickStart/QuickStart.md @@ -57,10 +57,20 @@ IoTDB 支持多种安装途径。用户可以使用三种方式对 IoTDB 进行 Linux 系统与 MacOS 系统启动命令如下: ``` -> nohup sbin/start-server.sh >/dev/null 2>&1 & +> nohup sbin/start-server.sh -f or -> nohup sbin/start-server.sh -c <conf_path> -rpc_port <rpc_port> >/dev/null 2>&1 & -``` +> nohup sbin/start-server.sh +``` +可选参数: +- 默认不含任何参数时, iotdb 将在后台启动,并且不在控制台打印日志 +- "-v": 查看iotdb版本 +- "-f": 在控制台前台启动iotdb +- "-p \<pidfile\>": 将pid保存到指定的文件中 +- "-h": 查看帮助 +- "printgc"(必须是最后一个参数): 打印GC日志 (从v0.14起,该参数将被-g取代) +- "-g": 打印GC日志 +- "-c \<config folder\>": 设置IOTDB_CONF变量的值,从而修改配置文件所在文件夹 +- "-D <a=b>": 设置Java的系统环境变量或其他参数 Windows 系统启动命令如下: 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/start-server.sh b/server/src/assembly/resources/sbin/start-server.sh index e840f42eb4..e73de6c160 100755 --- a/server/src/assembly/resources/sbin/start-server.sh +++ b/server/src/assembly/resources/sbin/start-server.sh @@ -18,12 +18,6 @@ # under the License. # - -echo --------------------- -echo Starting IoTDB -echo --------------------- - - if [ "x$IOTDB_INCLUDE" = "x" ]; then # Locations (in order) to use when searching for an include file. for include in "`dirname "$0"`/iotdb.in.sh" \ @@ -41,7 +35,6 @@ elif [ -r "$IOTDB_INCLUDE" ]; then . "$IOTDB_INCLUDE" fi - if [ -z "${IOTDB_HOME}" ]; then export IOTDB_HOME="`dirname "$0"`/.." fi @@ -54,26 +47,103 @@ if [ -z "${IOTDB_LOG_DIR}" ]; then export IOTDB_LOG_DIR=${IOTDB_HOME}/logs fi +if [ -z "${configurationFile}" ]; then + IOTDB_LOG_CONFIG="${IOTDB_CONF}/logback.xml" +fi -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" +# Parse any command line options. +args=`getopt gvRfhp:c:bD::H:E: "$@"` +eval set -- "$args" + +while true; do + case "$1" in + -c) + IOTDB_CONF="$2" + shift 2 + ;; + -p) + pidfile="$2" + shift 2 + ;; + -f) + foreground="yes" + shift + ;; + -g) + PRINT_GC="yes" + shift + ;; + -H) + IOTDB_JVM_OPTS="$IOTDB_JVM_OPTS -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" + shift 2 + ;; + -h) + echo "Usage: $0 [-v] [-f] [-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 + ;; + *) + echo "Error parsing arguments! Unknown argument \"$1\"" >&2 + exit 1 + ;; + esac +done + +CLASSPATH="" +for f in ${IOTDB_HOME}/lib/*.jar; do + CLASSPATH=${CLASSPATH}":"$f done -CONF_PARAMS=$* +classname=org.apache.iotdb.db.service.IoTDB + +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 + JAVA=java + fi + exec "$JAVA" -cp "$CLASSPATH" $IOTDB_JVM_OPTS "-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}" "$classname" + exit 0 +fi + +echo --------------------- +echo Starting IoTDB +echo --------------------- + +## this is for being compatibile with v0.13, can be removed from v0.14 on. +data=($*) +if [ "x${data[0]}" == "xprintgc" ]; then + PRINT_GC="yes" +fi +## end if [ -f "$IOTDB_CONF/iotdb-env.sh" ]; then - if [ "$#" -ge "1" -a "$1" == "printgc" ]; then + if [ "x$PRINT_GC" != "x" ]; then . "$IOTDB_CONF/iotdb-env.sh" "printgc" else . "$IOTDB_CONF/iotdb-env.sh" @@ -82,22 +152,42 @@ else echo "can't find $IOTDB_CONF/iotdb-env.sh" fi -CLASSPATH="" -for f in ${IOTDB_HOME}/lib/*.jar; do - CLASSPATH=${CLASSPATH}":"$f -done -classname=org.apache.iotdb.db.service.IoTDB - launch_service() { class="$1" - iotdb_parms="-Dlogback.configurationFile=${IOTDB_CONF}/logback.xml" + iotdb_parms="-Dlogback.configurationFile=${IOTDB_LOG_CONFIG}" iotdb_parms="$iotdb_parms -DIOTDB_HOME=${IOTDB_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=${DIOTDB_LOG_DIR}" + + if [ "x$pidpath" != "x" ]; then + iotdb_parms="$iotdb_parms -Diotdb-pidfile=$pidpath" + 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" != "x" ]; then + iotdb_parms="$iotdb_parms -Diotdb-foreground=yes" + 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 + else + 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-server.bat b/server/src/assembly/resources/sbin/stop-server.bat index a2f85581fa..4944e7449f 100755 --- a/server/src/assembly/resources/sbin/stop-server.bat +++ b/server/src/assembly/resources/sbin/stop-server.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-engine.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 IoTDB, PID:" %%a ) rem ps ax | grep -i 'iotdb.IoTDB' | grep -v grep | awk '{print $1}' | xargs kill -SIGTERM diff --git a/server/src/assembly/resources/sbin/stop-server.sh b/server/src/assembly/resources/sbin/stop-server.sh index 0cd069a8fb..92f4c4428f 100755 --- a/server/src/assembly/resources/sbin/stop-server.sh +++ b/server/src/assembly/resources/sbin/stop-server.sh @@ -22,6 +22,8 @@ IOTDB_CONF="`dirname "$0"`/../conf" rpc_port=`sed '/^rpc_port=/!d;s/.*=//' ${IOTDB_CONF}/iotdb-engine.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,5 +40,5 @@ if [ -z "$PID" ]; then exit 1 else kill -s TERM $PID - echo "close IoTDB" + echo "close IoTDB, PID:" $PID fi diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java index 337a9e0a6e..7a406386ca 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConstant.java @@ -64,6 +64,9 @@ public class IoTDBConstant { public static final String LAST_VALUE = "last_value"; public static final int MIN_SUPPORTED_JDK_VERSION = 8; + public static final String IOTDB_FOREGROUND = "iotdb-foreground"; + public static final String IOTDB_PIDFILE = "iotdb-pidfile"; + // show info public static final String COLUMN_ITEM = " item"; public static final String COLUMN_VALUE = "value"; 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 66ffc23ac4..fb10ab2dd3 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 @@ -51,6 +51,7 @@ import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.io.IOException; import static org.apache.iotdb.db.utils.JarLoaderUtil.loadExternLib; @@ -133,9 +134,18 @@ public class IoTDB implements IoTDBMBean { config.setEnablePartialInsert(prevIsEnablePartialInsert); activated = true; + 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/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..5ea7c01104 --- /dev/null +++ b/server/src/test/java/org/apache/iotdb/db/service/DaemonTest.java @@ -0,0 +1,41 @@ +/* + * 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.IoTDBConstant; + +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(IoTDBConstant.IOTDB_PIDFILE, "./iotdb.pid"); + // no pid set, so there is nothing happens + ioTDB.processPid(); + } +}
