You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by er...@apache.org on 2022/02/11 02:04:57 UTC

[iotdb] branch master updated: [IOTDB-2523] Fix exiting with 0 when executing error in cli (#5026)

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

ericpai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new e3240f5  [IOTDB-2523] Fix exiting with 0 when executing error in cli (#5026)
e3240f5 is described below

commit e3240f5703650ef631a9562b523688f2c17beddb
Author: BaiJian <er...@hotmail.com>
AuthorDate: Fri Feb 11 10:04:02 2022 +0800

    [IOTDB-2523] Fix exiting with 0 when executing error in cli (#5026)
---
 cli/src/assembly/resources/sbin/start-cli.bat      |  7 ++-
 cli/src/assembly/resources/tools/export-csv.bat    |  7 ++-
 cli/src/assembly/resources/tools/import-csv.bat    |  7 ++-
 .../java/org/apache/iotdb/cli/AbstractCli.java     | 68 ++++++++++++++--------
 cli/src/main/java/org/apache/iotdb/cli/Cli.java    | 15 +++--
 .../org/apache/iotdb/tool/AbstractCsvTool.java     |  3 +
 .../main/java/org/apache/iotdb/tool/ExportCsv.java | 18 ++++--
 .../main/java/org/apache/iotdb/tool/ImportCsv.java | 33 +++++++----
 .../java/org/apache/iotdb/cli/AbstractScript.java  | 19 +++++-
 .../org/apache/iotdb/cli/StartClientScriptIT.java  | 16 ++---
 .../iotdb/tool/integration/ExportCsvTestIT.java    |  4 +-
 .../iotdb/tool/integration/ImportCsvTestIT.java    |  4 +-
 12 files changed, 136 insertions(+), 65 deletions(-)

diff --git a/cli/src/assembly/resources/sbin/start-cli.bat b/cli/src/assembly/resources/sbin/start-cli.bat
index d77b15d..95cdc0a 100644
--- a/cli/src/assembly/resources/sbin/start-cli.bat
+++ b/cli/src/assembly/resources/sbin/start-cli.bat
@@ -59,16 +59,19 @@ echo %PARAMETERS% | findstr /c:"-h ">nul && (set PARAMETERS=%PARAMETERS%) || (se
 echo %PARAMETERS%
 
 "%JAVA_HOME%\bin\java" %JAVA_OPTS% -cp %CLASSPATH% %MAIN_CLASS% %PARAMETERS%
-
+set ret_code=%ERRORLEVEL%
 goto finally
 
 
 :err
 echo JAVA_HOME environment variable must be set!
+set ret_code=1
 pause
 
 
 @REM -----------------------------------------------------------------------------
 :finally
 
-ENDLOCAL
\ No newline at end of file
+ENDLOCAL
+
+EXIT %ret_code%
diff --git a/cli/src/assembly/resources/tools/export-csv.bat b/cli/src/assembly/resources/tools/export-csv.bat
index 44c4334..2f4fd5e 100644
--- a/cli/src/assembly/resources/tools/export-csv.bat
+++ b/cli/src/assembly/resources/tools/export-csv.bat
@@ -42,15 +42,18 @@ set CLASSPATH=%IOTDB_HOME%\lib\*
 REM -----------------------------------------------------------------------------
 
 "%JAVA_HOME%\bin\java" -DIOTDB_HOME=%IOTDB_HOME% %JAVA_OPTS% -cp %CLASSPATH% %MAIN_CLASS% %*
-
+set ret_code=%ERRORLEVEL%
 goto finally
 
 
 :err
 echo JAVA_HOME environment variable must be set!
+set ret_code=1
 pause
 
 @REM -----------------------------------------------------------------------------
 :finally
 
-ENDLOCAL
\ No newline at end of file
+ENDLOCAL
+
+EXIT %ret_code%
diff --git a/cli/src/assembly/resources/tools/import-csv.bat b/cli/src/assembly/resources/tools/import-csv.bat
index 87d71ae..ca9392e 100644
--- a/cli/src/assembly/resources/tools/import-csv.bat
+++ b/cli/src/assembly/resources/tools/import-csv.bat
@@ -42,16 +42,19 @@ set CLASSPATH=%IOTDB_HOME%\lib\*
 REM -----------------------------------------------------------------------------
 
 "%JAVA_HOME%\bin\java" -DIOTDB_HOME=%IOTDB_HOME% %JAVA_OPTS% -cp %CLASSPATH% %MAIN_CLASS% %*
-
+set ret_code=%ERRORLEVEL%
 goto finally
 
 
 :err
 echo JAVA_HOME environment variable must be set!
+set ret_code=1
 pause
 
 
 @REM -----------------------------------------------------------------------------
 :finally
 
-ENDLOCAL
\ No newline at end of file
+ENDLOCAL
+
+EXIT %ret_code%
diff --git a/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java b/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
index 133fe76..1cbed9d 100644
--- a/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
+++ b/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
@@ -72,6 +72,9 @@ public abstract class AbstractCli {
   private static final String EXECUTE_NAME = "execute";
   private static final String NULL = "null";
 
+  static final int CODE_OK = 0;
+  static final int CODE_ERROR = 1;
+
   static final String ISO8601_ARGS = "disableISO8601";
   static final List<String> AGGREGRATE_TIME_LIST = new ArrayList<>();
   static final String MAX_PRINT_ROW_COUNT_ARGS = "maxPRC";
@@ -118,6 +121,8 @@ public abstract class AbstractCli {
 
   private static boolean cursorBeforeFirst = true;
 
+  static int lastProcessStatus = CODE_OK;
+
   static void init() {
     keywordSet.add("-" + HOST_ARGS);
     keywordSet.add("-" + HELP_ARGS);
@@ -318,6 +323,7 @@ public abstract class AbstractCli {
   }
 
   static OperationResult handleInputCmd(String cmd, IoTDBConnection connection) {
+    lastProcessStatus = CODE_OK;
     String specialCmd = cmd.toLowerCase().trim();
 
     if (QUIT_COMMAND.equals(specialCmd) || EXIT_COMMAND.equals(specialCmd)) {
@@ -328,27 +334,27 @@ public abstract class AbstractCli {
       return OperationResult.CONTINUE_OPER;
     }
     if (specialCmd.startsWith(SET_TIMESTAMP_DISPLAY)) {
-      setTimestampDisplay(specialCmd, cmd);
+      lastProcessStatus = setTimestampDisplay(specialCmd, cmd);
       return OperationResult.CONTINUE_OPER;
     }
 
     if (specialCmd.startsWith(SET_TIME_ZONE)) {
-      setTimeZone(specialCmd, cmd, connection);
+      lastProcessStatus = setTimeZone(specialCmd, cmd, connection);
       return OperationResult.CONTINUE_OPER;
     }
 
     if (specialCmd.startsWith(SET_FETCH_SIZE)) {
-      setFetchSize(specialCmd, cmd);
+      lastProcessStatus = setFetchSize(specialCmd, cmd);
       return OperationResult.CONTINUE_OPER;
     }
 
     if (specialCmd.startsWith(SET_MAX_DISPLAY_NUM)) {
-      setMaxDisplayNum(specialCmd, cmd);
+      lastProcessStatus = setMaxDisplayNum(specialCmd, cmd);
       return OperationResult.CONTINUE_OPER;
     }
 
     if (specialCmd.startsWith(SHOW_TIMEZONE)) {
-      showTimeZone(connection);
+      lastProcessStatus = showTimeZone(connection);
       return OperationResult.CONTINUE_OPER;
     }
     if (specialCmd.startsWith(SHOW_TIMESTAMP_DISPLAY)) {
@@ -361,11 +367,11 @@ public abstract class AbstractCli {
     }
 
     if (specialCmd.startsWith(IMPORT_CMD)) {
-      importCmd(specialCmd, cmd, connection);
+      lastProcessStatus = importCmd(specialCmd, cmd, connection);
       return OperationResult.CONTINUE_OPER;
     }
 
-    executeQuery(connection, cmd);
+    lastProcessStatus = executeQuery(connection, cmd);
     return OperationResult.NO_OPER;
   }
 
@@ -390,21 +396,22 @@ public abstract class AbstractCli {
             SET_MAX_DISPLAY_NUM));
   }
 
-  private static void setTimestampDisplay(String specialCmd, String cmd) {
+  private static int setTimestampDisplay(String specialCmd, String cmd) {
     String[] values = specialCmd.split("=");
     if (values.length != 2) {
       println(
           String.format(
               "Time display format error, please input like %s=ISO8601", SET_TIMESTAMP_DISPLAY));
-      return;
+      return CODE_ERROR;
     }
     try {
       timeFormat = RpcUtils.setTimeFormat(cmd.split("=")[1]);
     } catch (Exception e) {
       println(String.format("time display format error, %s", e.getMessage()));
-      return;
+      return CODE_ERROR;
     }
     println("Time display type has set to " + cmd.split("=")[1].trim());
+    return CODE_OK;
   }
 
   /**
@@ -414,86 +421,94 @@ public abstract class AbstractCli {
    * @param specialCmd
    * @param cmd
    * @param connection
+   * @return execute result code
    */
-  private static void setTimeZone(String specialCmd, String cmd, IoTDBConnection connection) {
+  private static int setTimeZone(String specialCmd, String cmd, IoTDBConnection connection) {
     String[] values = specialCmd.split("=");
     if (values.length != 2) {
       println(String.format("Time zone format error, please input like %s=+08:00", SET_TIME_ZONE));
-      return;
+      return CODE_ERROR;
     }
     try {
       connection.setTimeZone(cmd.split("=")[1].trim());
     } catch (Exception e) {
       println(String.format("Time zone format error: %s", e.getMessage()));
-      return;
+      return CODE_ERROR;
     }
     println("Time zone has set to " + values[1].trim());
+    return CODE_OK;
   }
 
-  private static void setFetchSize(String specialCmd, String cmd) {
+  private static int setFetchSize(String specialCmd, String cmd) {
     String[] values = specialCmd.split("=");
     if (values.length != 2) {
       println(String.format("Fetch size format error, please input like %s=10000", SET_FETCH_SIZE));
-      return;
+      return CODE_ERROR;
     }
     try {
       setFetchSize(cmd.split("=")[1]);
     } catch (Exception e) {
       println(String.format("Fetch size format error, %s", e.getMessage()));
-      return;
+      return CODE_ERROR;
     }
     println("Fetch size has set to " + values[1].trim());
+    return CODE_OK;
   }
 
-  private static void setMaxDisplayNum(String specialCmd, String cmd) {
+  private static int setMaxDisplayNum(String specialCmd, String cmd) {
     String[] values = specialCmd.split("=");
     if (values.length != 2) {
       println(
           String.format(
               "Max display number format error, please input like %s = 10000",
               SET_MAX_DISPLAY_NUM));
-      return;
+      return CODE_ERROR;
     }
     try {
       setMaxDisplayNumber(cmd.split("=")[1]);
     } catch (Exception e) {
       println(String.format("Max display number format error, %s", e.getMessage()));
-      return;
+      return CODE_ERROR;
     }
     println("Max display number has set to " + values[1].trim());
+    return CODE_OK;
   }
 
-  private static void showTimeZone(IoTDBConnection connection) {
+  private static int showTimeZone(IoTDBConnection connection) {
     try {
       println("Current time zone: " + connection.getTimeZone());
     } catch (Exception e) {
       println("Cannot get time zone from server side because: " + e.getMessage());
+      return CODE_ERROR;
     }
+    return CODE_OK;
   }
 
-  private static void importCmd(String specialCmd, String cmd, IoTDBConnection connection) {
+  private static int importCmd(String specialCmd, String cmd, IoTDBConnection connection) {
     String[] values = specialCmd.split(" ");
     if (values.length != 2) {
       println(
           "Please input like: import /User/myfile. "
               + "Noted that your file path cannot contain any space character)");
-      return;
+      return CODE_ERROR;
     }
     println(cmd.split(" ")[1]);
     try {
-      ImportCsv.importFromTargetPath(
+      return ImportCsv.importFromTargetPath(
           host,
-          Integer.valueOf(port),
+          Integer.parseInt(port),
           username,
           password,
           cmd.split(" ")[1],
           connection.getTimeZone());
     } catch (IoTDBConnectionException e) {
       e.printStackTrace();
+      return CODE_ERROR;
     }
   }
 
-  private static void executeQuery(IoTDBConnection connection, String cmd) {
+  private static int executeQuery(IoTDBConnection connection, String cmd) {
+    int executeStatus = CODE_OK;
     long startTime = System.currentTimeMillis();
     try (Statement statement = connection.createStatement()) {
       ZoneId zoneId = ZoneId.of(connection.getTimeZone());
@@ -533,6 +548,7 @@ public abstract class AbstractCli {
               }
             } catch (IOException e) {
               e.printStackTrace();
+              executeStatus = CODE_ERROR;
             }
           }
           // output tracing activity
@@ -547,9 +563,11 @@ public abstract class AbstractCli {
       }
     } catch (Exception e) {
       println("Msg: " + e.getMessage());
+      executeStatus = CODE_ERROR;
     } finally {
       resetArgs();
     }
+    return executeStatus;
   }
 
   /**
diff --git a/cli/src/main/java/org/apache/iotdb/cli/Cli.java b/cli/src/main/java/org/apache/iotdb/cli/Cli.java
index b13ff71..e4cf0ec 100644
--- a/cli/src/main/java/org/apache/iotdb/cli/Cli.java
+++ b/cli/src/main/java/org/apache/iotdb/cli/Cli.java
@@ -66,14 +66,14 @@ public class Cli extends AbstractCli {
               + "-h xxx.xxx.xxx.xxx -p xxxx -u xxx.");
       println("For more information, please check the following hint.");
       hf.printHelp(SCRIPT_HINT, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
     init();
     String[] newArgs = removePasswordArgs(args);
     String[] newArgs2 = processExecuteArgs(newArgs);
     boolean continues = parseCommandLine(options, newArgs2, hf);
     if (!continues) {
-      return;
+      System.exit(CODE_ERROR);
     }
 
     try {
@@ -82,8 +82,10 @@ public class Cli extends AbstractCli {
       username = checkRequiredArg(USERNAME_ARGS, USERNAME_NAME, commandLine, true, null);
     } catch (ArgsErrorException e) {
       println(IOTDB_CLI_PREFIX + "> input params error because" + e.getMessage());
+      System.exit(CODE_ERROR);
     } catch (Exception e) {
       println(IOTDB_CLI_PREFIX + "> exit cli with error " + e.getMessage());
+      System.exit(CODE_ERROR);
     }
 
     lineReader = JlineUtils.getLineReader(username, host, port);
@@ -135,9 +137,10 @@ public class Cli extends AbstractCli {
           timestampPrecision = properties.getTimestampPrecision();
           AGGREGRATE_TIME_LIST.addAll(properties.getSupportedTimeAggregationOperations());
           processCommand(execute, connection);
-          return;
+          System.exit(lastProcessStatus);
         } catch (SQLException e) {
           println(IOTDB_CLI_PREFIX + "> can't execute sql because" + e.getMessage());
+          System.exit(CODE_ERROR);
         }
       }
       if (password == null) {
@@ -146,6 +149,7 @@ public class Cli extends AbstractCli {
       receiveCommands(lineReader);
     } catch (Exception e) {
       println(IOTDB_CLI_PREFIX + "> exit cli with error " + e.getMessage());
+      System.exit(CODE_ERROR);
     }
   }
 
@@ -174,17 +178,18 @@ public class Cli extends AbstractCli {
           try {
             reader.readLine("Press CTRL+C again to exit, or press ENTER to continue", '\0');
           } catch (UserInterruptException | EndOfFileException e2) {
-            System.exit(0);
+            System.exit(CODE_OK);
           }
         } catch (EndOfFileException e) {
           // Exit on EOF (usually by pressing CTRL+D).
-          System.exit(0);
+          System.exit(CODE_OK);
         }
       }
     } catch (SQLException e) {
       println(
           String.format(
               "%s> %s Host is %s, port is %s.", IOTDB_CLI_PREFIX, e.getMessage(), host, port));
+      System.exit(CODE_ERROR);
     }
   }
 }
diff --git a/cli/src/main/java/org/apache/iotdb/tool/AbstractCsvTool.java b/cli/src/main/java/org/apache/iotdb/tool/AbstractCsvTool.java
index 3294406..54ddec9 100644
--- a/cli/src/main/java/org/apache/iotdb/tool/AbstractCsvTool.java
+++ b/cli/src/main/java/org/apache/iotdb/tool/AbstractCsvTool.java
@@ -98,6 +98,9 @@ public abstract class AbstractCsvTool {
         "yyyy/MM/dd'T'HH:mm:ss",
         "yyyy.MM.dd'T'HH:mm:ss"
       };
+  protected static final int CODE_OK = 0;
+  protected static final int CODE_ERROR = 1;
+
   protected static String host;
   protected static String port;
   protected static String username;
diff --git a/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java b/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
index 1524b43..db6e3e0 100644
--- a/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
+++ b/cli/src/main/java/org/apache/iotdb/tool/ExportCsv.java
@@ -94,7 +94,7 @@ public class ExportCsv extends AbstractCsvTool {
   public static void main(String[] args) {
     Options options = createOptions();
     HelpFormatter hf = new HelpFormatter();
-    CommandLine commandLine;
+    CommandLine commandLine = null;
     CommandLineParser parser = new DefaultParser();
     hf.setOptionComparator(null); // avoid reordering
     hf.setWidth(MAX_HELP_CONSOLE_WIDTH);
@@ -102,25 +102,25 @@ public class ExportCsv extends AbstractCsvTool {
     if (args == null || args.length == 0) {
       System.out.println("Too few params input, please check the following hint.");
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
     try {
       commandLine = parser.parse(options, args);
     } catch (ParseException e) {
       System.out.println(e.getMessage());
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
     if (commandLine.hasOption(HELP_ARGS)) {
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
-
+    int exitCode = CODE_OK;
     try {
       parseBasicParams(commandLine);
       parseSpecialParams(commandLine);
       if (!checkTimeFormat()) {
-        return;
+        System.exit(CODE_ERROR);
       }
 
       session = new Session(host, Integer.parseInt(port), username, password);
@@ -149,23 +149,29 @@ public class ExportCsv extends AbstractCsvTool {
 
     } catch (IOException e) {
       System.out.println("Failed to operate on file, because " + e.getMessage());
+      exitCode = CODE_ERROR;
     } catch (ArgsErrorException e) {
       System.out.println("Invalid args: " + e.getMessage());
+      exitCode = CODE_ERROR;
     } catch (IoTDBConnectionException | StatementExecutionException e) {
       System.out.println("Connect failed because " + e.getMessage());
+      exitCode = CODE_ERROR;
     } catch (TException e) {
       System.out.println(
           "Can not get the timestamp precision from server because " + e.getMessage());
+      exitCode = CODE_ERROR;
     } finally {
       if (session != null) {
         try {
           session.close();
         } catch (IoTDBConnectionException e) {
+          exitCode = CODE_ERROR;
           System.out.println(
               "Encounter an error when closing session, error is: " + e.getMessage());
         }
       }
     }
+    System.exit(exitCode);
   }
 
   private static void parseSpecialParams(CommandLine commandLine) throws ArgsErrorException {
diff --git a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
index e4eef04..5728f95 100644
--- a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
+++ b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
@@ -44,7 +44,12 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -164,24 +169,24 @@ public class ImportCsv extends AbstractCsvTool {
     HelpFormatter hf = new HelpFormatter();
     hf.setOptionComparator(null);
     hf.setWidth(MAX_HELP_CONSOLE_WIDTH);
-    CommandLine commandLine;
+    CommandLine commandLine = null;
     CommandLineParser parser = new DefaultParser();
 
     if (args == null || args.length == 0) {
       System.out.println("Too few params input, please check the following hint.");
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
     try {
       commandLine = parser.parse(options, args);
     } catch (org.apache.commons.cli.ParseException e) {
       System.out.println("Parse error: " + e.getMessage());
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
     if (commandLine.hasOption(HELP_ARGS)) {
       hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-      return;
+      System.exit(CODE_ERROR);
     }
 
     try {
@@ -189,16 +194,20 @@ public class ImportCsv extends AbstractCsvTool {
       String filename = commandLine.getOptionValue(FILE_ARGS);
       if (filename == null) {
         hf.printHelp(TSFILEDB_CLI_PREFIX, options, true);
-        return;
+        System.exit(CODE_ERROR);
       }
       parseSpecialParams(commandLine);
     } catch (ArgsErrorException e) {
       System.out.println("Args error: " + e.getMessage());
+      System.exit(CODE_ERROR);
     } catch (Exception e) {
       System.out.println("Encounter an error, because: " + e.getMessage());
+      System.exit(CODE_ERROR);
     }
 
-    importFromTargetPath(host, Integer.valueOf(port), username, password, targetPath, timeZoneID);
+    System.exit(
+        importFromTargetPath(
+            host, Integer.parseInt(port), username, password, targetPath, timeZoneID));
   }
 
   /**
@@ -211,13 +220,14 @@ public class ImportCsv extends AbstractCsvTool {
    * @param password
    * @param targetPath a CSV file or a directory including CSV files
    * @param timeZone
+   * @return the status code
    * @throws IoTDBConnectionException
    */
-  public static void importFromTargetPath(
+  public static int importFromTargetPath(
       String host, int port, String username, String password, String targetPath, String timeZone)
       throws IoTDBConnectionException {
     try {
-      session = new Session(host, Integer.valueOf(port), username, password, false);
+      session = new Session(host, port, username, password, false);
       session.open(false);
       timeZoneID = timeZone;
       setTimeZone();
@@ -228,7 +238,7 @@ public class ImportCsv extends AbstractCsvTool {
       } else if (file.isDirectory()) {
         File[] files = file.listFiles();
         if (files == null) {
-          return;
+          return CODE_OK;
         }
 
         for (File subFile : files) {
@@ -238,14 +248,17 @@ public class ImportCsv extends AbstractCsvTool {
         }
       } else {
         System.out.println("File not found!");
+        return CODE_ERROR;
       }
     } catch (IoTDBConnectionException | StatementExecutionException e) {
       System.out.println("Encounter an error when connecting to server, because " + e.getMessage());
+      return CODE_ERROR;
     } finally {
       if (session != null) {
         session.close();
       }
     }
+    return CODE_OK;
   }
 
   /**
diff --git a/cli/src/test/java/org/apache/iotdb/cli/AbstractScript.java b/cli/src/test/java/org/apache/iotdb/cli/AbstractScript.java
index 12eaae8..1172179 100644
--- a/cli/src/test/java/org/apache/iotdb/cli/AbstractScript.java
+++ b/cli/src/test/java/org/apache/iotdb/cli/AbstractScript.java
@@ -20,16 +20,22 @@ package org.apache.iotdb.cli;
 
 import org.apache.thrift.annotation.Nullable;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 public abstract class AbstractScript {
 
-  protected void testOutput(ProcessBuilder builder, @Nullable String[] output) throws IOException {
+  protected void testOutput(ProcessBuilder builder, @Nullable String[] output, int statusCode)
+      throws IOException {
     builder.redirectErrorStream(true);
     Process p = builder.start();
     BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
@@ -61,6 +67,15 @@ public abstract class AbstractScript {
         assertEquals(output[output.length - 1 - i], outputList.get(outputList.size() - 1 - i));
       }
     }
+    while (p.isAlive()) {
+      try {
+        Thread.sleep(100);
+      } catch (InterruptedException e) {
+        e.printStackTrace();
+        fail();
+      }
+    }
+    assertEquals(statusCode, p.exitValue());
   }
 
   protected String getCliPath() {
diff --git a/cli/src/test/java/org/apache/iotdb/cli/StartClientScriptIT.java b/cli/src/test/java/org/apache/iotdb/cli/StartClientScriptIT.java
index 0039b12..18622c2 100644
--- a/cli/src/test/java/org/apache/iotdb/cli/StartClientScriptIT.java
+++ b/cli/src/test/java/org/apache/iotdb/cli/StartClientScriptIT.java
@@ -20,7 +20,9 @@ package org.apache.iotdb.cli;
 
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 
-import org.junit.*;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 import java.io.File;
 import java.io.IOException;
@@ -66,7 +68,7 @@ public class StartClientScriptIT extends AbstractScript {
             "root",
             "-pw",
             "root");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
 
     final String[] output2 = {"Msg: The statement is executed successfully."};
     ProcessBuilder builder2 =
@@ -78,7 +80,7 @@ public class StartClientScriptIT extends AbstractScript {
             "0",
             "-e",
             "\"flush\"");
-    testOutput(builder2, output2);
+    testOutput(builder2, output2, 0);
 
     final String[] output3 = {
       "IoTDB> error format of max print row count, it should be an integer number"
@@ -90,7 +92,7 @@ public class StartClientScriptIT extends AbstractScript {
             dir + File.separator + "sbin" + File.separator + "start-cli.bat",
             "-maxPRC",
             "-1111111111111111111111111111");
-    testOutput(builder3, output3);
+    testOutput(builder3, output3, 1);
   }
 
   @Override
@@ -111,7 +113,7 @@ public class StartClientScriptIT extends AbstractScript {
             "root",
             "-pw",
             "root");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
 
     final String[] output2 = {"Msg: The statement is executed successfully."};
     ProcessBuilder builder2 =
@@ -122,7 +124,7 @@ public class StartClientScriptIT extends AbstractScript {
             "0",
             "-e",
             "\"flush\"");
-    testOutput(builder2, output2);
+    testOutput(builder2, output2, 0);
 
     final String[] output3 = {
       "IoTDB> error format of max print row count, it should be an integer number"
@@ -133,6 +135,6 @@ public class StartClientScriptIT extends AbstractScript {
             dir + File.separator + "sbin" + File.separator + "start-cli.sh",
             "-maxPRC",
             "-1111111111111111111111111111");
-    testOutput(builder3, output3);
+    testOutput(builder3, output3, 1);
   }
 }
diff --git a/cli/src/test/java/org/apache/iotdb/tool/integration/ExportCsvTestIT.java b/cli/src/test/java/org/apache/iotdb/tool/integration/ExportCsvTestIT.java
index b745e86..a1b735e 100644
--- a/cli/src/test/java/org/apache/iotdb/tool/integration/ExportCsvTestIT.java
+++ b/cli/src/test/java/org/apache/iotdb/tool/integration/ExportCsvTestIT.java
@@ -70,7 +70,7 @@ public class ExportCsvTestIT extends AbstractScript {
             "root",
             "-td",
             "./");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
   }
 
   @Override
@@ -97,6 +97,6 @@ public class ExportCsvTestIT extends AbstractScript {
             "root",
             "-td",
             "./");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
   }
 }
diff --git a/cli/src/test/java/org/apache/iotdb/tool/integration/ImportCsvTestIT.java b/cli/src/test/java/org/apache/iotdb/tool/integration/ImportCsvTestIT.java
index f5f8f86..5b9e577 100644
--- a/cli/src/test/java/org/apache/iotdb/tool/integration/ImportCsvTestIT.java
+++ b/cli/src/test/java/org/apache/iotdb/tool/integration/ImportCsvTestIT.java
@@ -70,7 +70,7 @@ public class ImportCsvTestIT extends AbstractScript {
             "root",
             "-f",
             "./");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
   }
 
   @Override
@@ -97,6 +97,6 @@ public class ImportCsvTestIT extends AbstractScript {
             "root",
             "-f",
             "./");
-    testOutput(builder, output);
+    testOutput(builder, output, 1);
   }
 }