Если я открываю терминал и запускаю приведенный ниже скрипт, он работает нормально. Значения из вызова gdbus
записываются в файл lockScreenTest.txt
. Значения равны true, когда экран заблокирован, и значения равны false, если экран разблокирован.
#!/bin/bash
while true; do
echo "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked)" >> lockScreenTest.txt
sleep 2
echo "called" >> lockScreenTest.txt
done
Но если я добавлю эту строку ./lockScreenCheck.sh&
в ~/.profile
и перезапущу компьютер, вывод gdbus
не будет записан в lockScreenTest.txt
. Вместо этого записывается только следующий вывод:
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
called
Почему вывод gdbus
недоступен при запуске сценария из ~/.profile
?
Я исследую это потому что я написал программу на Java, которая должна проверить, не заблокирован ли экран, и я делаю это примерно с помощью следующих команд:
String command = "gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked";
p = Runtime.getRuntime().exec(command);
p.waitFor();
Как и скрипт bash, программа на Java также работает нормально, если я запустить его из терминала с java -jar program.jar
, но если я вызову его из ~/.profile
, программа на Java запускается, но вывод команды gdbus неуловим.
Это, вероятно, перестало работать, потому что gdbus
не может установить соединение с рабочей шиной сессии.
Помнят, что ~/.profile
получен оболочками входа в систему; может иметь место, что менеджер по оформлению вызывает настольную сессию пользователя в оболочке входа в систему, но Вы не должны рассчитывать на него и даже если это сделает, то сессия будет ребенком оболочки, а не наоборот - переменные среды такой как DBUS_SESSION_BUS_ADDRESS
не будут установлены в родительской оболочке.
Для приложений, которые должны соединиться с шиной настольной сессии, Вы - более обеспеченное использование функции "Startup Applications" GUI - видят, например , Как я запускаю приложения автоматически на входе в систему?