답변:
문제는 다소 유사하다 있는 X 표시를 접근 하고 있는 X 쿠키 파일의 위치를 찾는 . 또한 사용자 디스플레이에서 GUI 프로그램을 시작하려면이 질문을 참조하십시오.
Dbus는 세션 주소를의 파일에 저장합니다 ~/.dbus/session-bus
. 파일 이름은 $machine_id-$display_number
여기서, $machine_id
임의로 생성 된 번호에 저장 /var/lib/dbus/machine-id
하고 $display_number
있는 X 표시 번호는 (인 $DISPLAY
인 :$display_number
또는 :$display_number.$screen_number
). 의 파일은 ~/.dbus/session-bus
쉘에 의해 구문 분석하고 대한 정의를 포함 DBUS_SESSION_BUS_ADDRESS
하고 DBUS_SESSION_BUS_PID
.
dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
if [ -e "$dbus_session_file" ]; then
. "$dbus_session_file"
export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
dbus-send …
fi
dbus 데몬이 여전히 사용 가능하다는 보장은 없습니다. 사용자가 로그 아웃했을 수 있습니다.
다른 방법은 데스크탑 세션에서 프로세스의 PID를 찾고 해당 환경에서 dbus 주소를 얻는 것입니다.
export $(</proc/$pid/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
crontab이 루트로 실행 중이고 콘솔에 로그인 한 사용자의 세션과 통신하려는 경우 루트 로 다른 사용자의 데스크탑에서 그래픽 프로그램을 시작할 수 있습니까?를 참조하십시오 .
Vincenzo의 답변 에 대해서는 언급 할 수 없지만 KDE4에서 그의 답변이 가장 효과적이라는 것을 알았습니다.
그래도 명령을 약간 수정해야했습니다. 나를 위해 :
ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35
공지 사항 ADDRESS
대문자한다.
예 DBus에는 도끼 세션이 있어야합니다. 이전 답변과 마찬가지로 'DBUS_SESSION_BUS_ADDRESS'는 시작하기 전에 값을 가져야합니다. 그러나 'dbus-launch'를 사용하여이 값을 만들 수 있습니다. 다음 스 니펫은 crontab에서 호출 된 스크립트에 넣을 수 있습니다.
if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
eval `dbus-launch --sh-syntax`
fi
echo "D-Bus daemon address is:"
echo "$DBUS_SESSION_BUS_ADDRESS"
# -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
sudo -u <user> -E <program>
이 솔루션의 한 가지 단점은 소프트웨어를 중지 한 후 세션이 중단 될 수 있다는 것입니다.
plasma-desktop
대신 감사합니다!