Я новичок в dbus
, и видел разные способы выхода из терминала в зависимости от окружения рабочего стола. Но мне интересно, есть ли способ выхода из любого окружения рабочего стола с помощью dbus
сообщений?
В GNOME:
dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1
В KDE:
dbus-send --print-reply --dest=org.kde.ksmserver /KSMServer org.kde.KSMServerInterface.logout int32:0 int32:0 int32:0
Есть ли команда, которая будет работать в любой среде рабочего стола (например, system dbus
)?
решение1
При systemd
настройке вы должны иметь возможность принудительно завершить сеанс черезlogind
dbus
интерфейс:
busctl call org.freedesktop.login1 /org/freedesktop/login1 \
org.freedesktop.login1.Manager TerminateSession s \
$(loginctl show-user $UID --property=Sessions --value)
Обратите внимание, что это busctl
было введено в systemd
v. 221
- в качестве альтернативы, на всех установках вы можете запустить:
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 'org.freedesktop.login1.Manager.TerminateSession' \
string:c2
где c2
находится идентификатор сеанса, его можно получить через
dbus-send --system --print-reply --dest=org.freedesktop.login1 \
/org/freedesktop/login1 'org.freedesktop.login1.Manager.ListSessions'
который возвращает что-то вроде этого:
array [
struct {
string "c1"
uint32 120
string "gdm"
string "seat0"
object path "/org/freedesktop/login1/session/c1"
}
struct {
string "c2"
uint32 1000
string "don"
string "seat0"
object path "/org/freedesktop/login1/session/c2"
}
]