Intereting Posts
Получение динамического брандмауэра из Fedora 15 в Ubuntu? Проблема с gnome-shell-extensions-user-theme Почему apt удаляет нежелательные пакеты при предоставлении * в качестве суффикса? Как настроить apache / php / postfix сообщения электронной почты при использовании vhosts? xubuntu только для чтения Мерцание с экспериментальным драйвером на Geforce 8200M Windows 8.1 изменяет порядок загрузки Запуск сценария при запуске до входа в систему Как установить Edubuntu 11.10 с DVD на существующий Ubuntu Веб-страницы в Firefox прокручиваются автоматически. Кто-то вторгается на мой компьютер? Как настроить шрифты Kubuntu на поиск строк, используемых в Unity – Ubuntu 12.04? Почему я не могу установить FreePascal и Gold Linker одновременно? Подключение к Интернету с использованием TataPhoton 3G-ключа (ZTE MF190) Ubuntu 12.04 Можно ли использовать поляну с интроспекцией python pygi? Как установить близость процессора к процессу

Как получить доступ к сеансу D-Bus из системного пользовательского сервиса?

У меня есть пользовательский запуск сценария оболочки, который пытается получить доступ к состоянию lockscreen моего сеанса следующим образом:

# Test Unity screen-lock: isLocked() { isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked) } lock() { if [[ $isLocked == "(false,)" ]]; then gnome-screensaver-command -l elif [[ $isLocked == "(true,)" ]]; then exit 1 fi exit 0 } 

Проблема заключается в обслуживании: «это процесс для каждого пользователя, а не сеанс», и я не знаю, как получить доступ к сеансу dbus:

 GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name com.canonical.Unity was not provided by any .service files 

Я столкнулся с этой же проблемой, и мои исследования ничего не изменили. Если кто-то может найти лучший способ запросить статус блокировки Unity, я хотел бы услышать об этом.

Недавно я узнал о названных каналах, и в то время я задавался вопросом, для чего я могу использовать такую ​​вещь. Эта проблема, оказывается, оказывается идеальным приложением.

Создайте следующий скрипт …

 #!/bin/bash # this script is meant to be called in two different ways. # 1. It can be called as a service by passing "service" as the first argument. In this # mode, the script listens for requests for lock screen status. The script should be # run in this mode with startup applications on user logon. # 2. If this script is called without any arguments, it will call the service to request # the current lock screen status. Call this script in this manner from your user # service. # this will be the named pipe we'll use for requesting and receiving screen lock status pipe="/tmp/lockscreen-status" if [ "$1" == "service" ]; then # setup the named pipe rm "$pipe" mkfifo "$pipe" # start watching for requests while true do # watch the pipe for trigger events requesting lock screen status read request < "$pipe" # respond across the same pipe wit the current lock screen status gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -oP "(true)|(false)" > "$pipe" done else # make sure the pipe exists if [ ! -e "$pipe" ]; then echo "This script must started in service mode before lock status can be queried." exit fi # send a request for screen lock status and read the response touch "$pipe" read status < "$pipe" [ "$status" == "" ] && status="This script must started in service mode before lock status can be queried." # print reponse to screen for use by calling application echo $status fi 

Как отмечено в комментариях, вам нужно вызвать этот скрипт двумя способами. Когда ваш пользователь входит в систему, запустите этот сценарий в сервисном режиме. Я использую программу «Запуск приложений» для вызова сценария, но на самом деле не имеет значения, как он вызывается до тех пор, пока он вызван вашей учетной записью пользователя при входе в систему. Затем из вашей пользовательской службы просто сделайте вызов этого скрипта, и он вернет «true», если экран заблокирован или «false», если экран разблокирован.