diff --git a/app/electron/main.js b/app/electron/main.js index 747e0fc00..fbfe941cd 100644 --- a/app/electron/main.js +++ b/app/electron/main.js @@ -53,10 +53,8 @@ try { } } catch (e) { console.error(e) - require('electron'). - dialog. - showErrorBox('创建配置目录失败 Failed to create config directory', - '思源需要在用户家目录下创建配置文件夹(~/.config/siyuan),请确保该路径具有写入权限。\n\nSiYuan needs to create a configuration folder (~/.config/siyuan) in the user\'s home directory. Please make sure that the path has write permissions.') + require('electron').dialog.showErrorBox('创建配置目录失败 Failed to create config directory', + '思源需要在用户家目录下创建配置文件夹(~/.config/siyuan),请确保该路径具有写入权限。\n\nSiYuan needs to create a configuration folder (~/.config/siyuan) in the user\'s home directory. Please make sure that the path has write permissions.') app.exit() } @@ -889,6 +887,7 @@ app.on('before-quit', (event) => { }) const {powerMonitor} = require('electron') +const {write} = require("fs"); powerMonitor.on('suspend', () => { writeLog('system suspend') @@ -926,11 +925,11 @@ powerMonitor.on('resume', async () => { return } - writeLog('sync after system resume') workspaces.forEach(item => { const currentURL = new URL(item.browserWindow.getURL()) - fetch(getServer(currentURL.port) + '/api/sync/performSync', - {method: 'POST'}) + const server = getServer(currentURL.port) + writeLog('sync after system resume [' + server + '/api/sync/performSync' + ']') + fetch(server + '/api/sync/performSync', {method: 'POST'}) }) }) @@ -938,6 +937,6 @@ powerMonitor.on('shutdown', () => { writeLog('system shutdown') workspaces.forEach(item => { const currentURL = new URL(item.browserWindow.getURL()) - fetch(getServer(currentURL.port) + '/api/system/exit', {method: 'POST'}) + fetch(getServer(currentURL.port) + '/api/system/exit', {method: 'POST'}) }) }) diff --git a/kernel/main.go b/kernel/main.go index 69e3d6c9b..14f92c102 100644 --- a/kernel/main.go +++ b/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() } diff --git a/kernel/model/conf.go b/kernel/model/conf.go index 00c9a09dc..842f246a0 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -675,7 +675,6 @@ func clearWorkspaceTemp() { os.RemoveAll(filepath.Join(util.TempDir, "import")) os.RemoveAll(filepath.Join(util.TempDir, "repo")) os.RemoveAll(filepath.Join(util.TempDir, "os")) - os.RemoveAll(filepath.Join(util.DataDir, "assets", ".siyuan", "assets.json")) // 退出时自动删除超过 7 天的安装包 https://github.com/siyuan-note/siyuan/issues/6128 install := filepath.Join(util.TempDir, "install") @@ -720,5 +719,10 @@ func clearWorkspaceTemp() { } } + // 老版本遗留文件清理 + os.RemoveAll(filepath.Join(util.DataDir, "assets", ".siyuan", "assets.json")) + os.RemoveAll(filepath.Join(util.WorkspaceDir, "backup")) + os.RemoveAll(filepath.Join(util.WorkspaceDir, "sync")) + logging.LogInfof("cleared workspace temp") } diff --git a/kernel/model/process.go b/kernel/model/process.go index 7ce0f82e8..2e00c5e1d 100644 --- a/kernel/model/process.go +++ b/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,46 @@ func HandleSignal() { logging.LogInfof("received os signal [%s], exit kernel process now", s) Close(false, 1) } + +func HookDesktopUIProc() { + if util.ContainerStd != util.Container || "dev" == util.Mode { + return + } + + time.Sleep(30 * time.Second) + uiProcNames := []string{"siyuan", "electron"} + 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 nil == proc { + return true + } + + procName := strings.ToLower(proc.Executable()) + for _, name := range uiProcNames { + if strings.Contains(procName, name) { + existUIProc = true + return false + } + } + return true + }) + + if !existUIProc { + logging.LogInfof("no active UI proc, exit kernel process now") + Close(false, 1) + } + } +}