Merge pull request #1707 from merico-dev/kw-1706-task-hangs

Kw 1706 task hangs
diff --git a/plugins/helper/api_collector.go b/plugins/helper/api_collector.go
index 5fecac5..069a5ab 100644
--- a/plugins/helper/api_collector.go
+++ b/plugins/helper/api_collector.go
@@ -179,7 +179,9 @@
 				break
 			}
 		}
-		wg.Wait()
+		if err == nil {
+			wg.Wait()
+		}
 	} else {
 		// or we just did it once
 		err = collector.exec(nil)
diff --git a/runner/directrun.go b/runner/directrun.go
index 4c2fa15..fecf449 100644
--- a/runner/directrun.go
+++ b/runner/directrun.go
@@ -2,6 +2,8 @@
 
 import (
 	"context"
+	"os"
+	"os/exec"
 
 	"github.com/merico-dev/lake/config"
 	"github.com/merico-dev/lake/logger"
@@ -39,11 +41,27 @@
 	if err != nil {
 		panic(err)
 	}
+
+	exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
+	ctx, cancel := context.WithCancel(context.Background())
+	go func() {
+		buf := make([]byte, 1)
+		n, err := os.Stdin.Read(buf)
+		if err != nil {
+			panic(err)
+		} else if n == 1 && buf[0] == 99 {
+			cancel()
+		} else {
+			println("unknown key press, code: ", buf[0])
+		}
+	}()
+	println("press `c` to send cancel signal")
+
 	err = RunPluginSubTasks(
 		cfg,
 		log,
 		db,
-		context.Background(),
+		ctx,
 		cmd.Use,
 		options,
 		pluginTask,