Forráskód Böngészése

:art: 桌面端内核进程根据 Electron 主进程判断是否自动退出 Fix https://github.com/siyuan-note/siyuan/issues/7002

Liang Ding 2 éve
szülő
commit
4ba967cc98
2 módosított fájl, 42 hozzáadás és 0 törlés
  1. 1 0
      kernel/main.go
  2. 41 0
      kernel/model/process.go

+ 1 - 0
kernel/main.go

@@ -51,6 +51,7 @@ func main() {
 	go sql.AutoFlushTreeQueue()
 	go treenode.AutoFlushBlockTree()
 	go cache.LoadAssets()
+	go model.HookDesktopUIProc()
 	model.WatchAssets()
 	model.HandleSignal()
 }

+ 41 - 0
kernel/model/process.go

@@ -19,9 +19,14 @@ package model
 import (
 	"os"
 	"os/signal"
+	"strconv"
+	"strings"
 	"syscall"
+	"time"
 
+	goPS "github.com/mitchellh/go-ps"
 	"github.com/siyuan-note/logging"
+	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
 func HandleSignal() {
@@ -31,3 +36,39 @@ func HandleSignal() {
 	logging.LogInfof("received os signal [%s], exit kernel process now", s)
 	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)
+		}
+	}
+}