|
@@ -19,9 +19,14 @@ package model
|
|
import (
|
|
import (
|
|
"os"
|
|
"os"
|
|
"os/signal"
|
|
"os/signal"
|
|
|
|
+ "strconv"
|
|
|
|
+ "strings"
|
|
"syscall"
|
|
"syscall"
|
|
|
|
+ "time"
|
|
|
|
|
|
|
|
+ goPS "github.com/mitchellh/go-ps"
|
|
"github.com/siyuan-note/logging"
|
|
"github.com/siyuan-note/logging"
|
|
|
|
+ "github.com/siyuan-note/siyuan/kernel/util"
|
|
)
|
|
)
|
|
|
|
|
|
func HandleSignal() {
|
|
func HandleSignal() {
|
|
@@ -31,3 +36,39 @@ func HandleSignal() {
|
|
logging.LogInfof("received os signal [%s], exit kernel process now", s)
|
|
logging.LogInfof("received os signal [%s], exit kernel process now", s)
|
|
Close(false, 1)
|
|
Close(false, 1)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func HookDesktopUIProc() {
|
|
|
|
+ if util.ContainerStd != util.Container {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ time.Sleep(30 * time.Second)
|
|
|
|
+ existUIProc := false
|
|
|
|
+ for range time.Tick(7 * time.Second) {
|
|
|
|
+ util.UIProcessIDs.Range(func(uiProcIDArg, _ interface{}) bool {
|
|
|
|
+ uiProcID, err := strconv.Atoi(uiProcIDArg.(string))
|
|
|
|
+ if nil != err {
|
|
|
|
+ logging.LogErrorf("invalid UI proc ID [%s]: %s", uiProcIDArg, err)
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ proc, err := goPS.FindProcess(uiProcID)
|
|
|
|
+ if nil != err {
|
|
|
|
+ logging.LogErrorf("find UI proc [%d] failed: %s", uiProcID, err)
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if strings.Contains(strings.ToLower(proc.Executable()), "siyuan") {
|
|
|
|
+ existUIProc = true
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ if !existUIProc {
|
|
|
|
+ logging.LogInfof("no active UI proc, exit kernel process now")
|
|
|
|
+ Close(false, 1)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|