From 0a3675e976642336acf609fddfe94cd92cfa8abf Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Tue, 28 Apr 2026 16:14:22 +0800 Subject: [PATCH] fix: stop app.slice before logout/shutdown to ensure clean user process termination Send SIGKILL to all processes in app.slice via systemd D-Bus KillUnit before logout and shutdown. Pms: BUG-350165,BUG-350171 Change-Id: Ibba4a31d93f107946af86b4b1e06a96a5ab4d0eb --- src/dde-session/impl/sessionmanager.cpp | 18 ++++++++++++++++++ src/dde-session/impl/sessionmanager.h | 2 ++ src/utils/utils.h | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/dde-session/impl/sessionmanager.cpp b/src/dde-session/impl/sessionmanager.cpp index 9b50d3e..427cc90 100644 --- a/src/dde-session/impl/sessionmanager.cpp +++ b/src/dde-session/impl/sessionmanager.cpp @@ -174,6 +174,7 @@ void SessionManager::prepareLogout(bool force) stopRedshift(); stopObexService(); stopDock(); + stopAppSlice(); // 防止注销时,蓝牙音频设置没有断开连接 disconnectAudioDevices(); @@ -513,6 +514,7 @@ void SessionManager::prepareShutdown(bool force) { stopSogouIme(); stopBAMFDaemon(); + stopAppSlice(); preparePlayShutdownSound(); stopPulseAudioService(); @@ -689,6 +691,22 @@ void SessionManager::stopDock() VIEW_SERVICE(DDE_DOCK_SERVICE); } +bool SessionManager::killUnitProcesses(const QString &unit, int signal) +{ + auto reply = m_systemd1ManagerInter->KillUnit(unit, "all", signal); + if (reply.isError()) { + qWarning() << "failed to kill unit:" << unit << ", error:" << reply.error().name(); + return false; + } + + return true; +} + +void SessionManager::stopAppSlice() +{ + killUnitProcesses(APP_SLICE, SIGKILL); +} + void SessionManager::disconnectAudioDevices() { auto msg = QDBusInterface("org.deepin.dde.Bluetooth1" diff --git a/src/dde-session/impl/sessionmanager.h b/src/dde-session/impl/sessionmanager.h index 5b2e12e..992ae97 100644 --- a/src/dde-session/impl/sessionmanager.h +++ b/src/dde-session/impl/sessionmanager.h @@ -91,6 +91,8 @@ public Q_SLOTS: void stopBAMFDaemon(); void stopRedshift(); void stopDock(); + bool killUnitProcesses(const QString &unit, int signal); + void stopAppSlice(); void disconnectAudioDevices(); void preparePlayShutdownSound(); diff --git a/src/utils/utils.h b/src/utils/utils.h index 0e8bb82..e913299 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2021 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -16,6 +16,7 @@ #define BAMFDAEMON_SERVICE "bamfdaemon.service" #define REDSHIFT_SERVICE "redshift.service" #define DDE_DOCK_SERVICE "dde-dock.service" +#define APP_SLICE "app.slice" // sound #define SOUND_EFFECT_SCHEMA "com.deepin.dde.sound-effect"