2016-07-27 2 views
0

У меня есть обслуживание пользователей работают скрипт, который пытается получить доступ к LockScreen состояния моей сессии, как это:Как получить доступ к сеансу D-Bus от системного пользователя?

# 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 
+0

Является ли переменная DBUS_SESSION_BUS_ADDRESS в этом коде? –

+0

Нет, это не так. Должно быть? –

+0

Насколько мне известно, необходимо подключиться к шине, и pam_systemd должен установить это при входе в систему. Если он не установлен, запускается новый dbus, и вы не сможете разговаривать с другими вещами. Я ничего не знаю об этом, поэтому не забудь об этом. –

ответ

1

Я столкнулся с этой же проблемой, и мои исследования ничего не дали. Если кто-то может найти лучший способ запросить статус блокировки 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», если экран разблокирован.

Смежные вопросы