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

This commit is contained in:
Liang Ding 2023-01-06 18:18:04 +08:00
parent 2296b6dc63
commit 4ba967cc98
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
2 changed files with 42 additions and 0 deletions

View file

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

View file

@ -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)
}
}
}