crontab에서 dbus 프로그램을 실행하십시오. 세션 ID에 대해 어떻게 알 수 있습니까?


17

crontab 내에서 일부 프로그램을 실행해야하지만 프로그램이 dbus 세션 ID에 대해 어떻게 알 수 있습니까? 세션 관리자가 시작한 프로그램에만 사용할 수 있습니다.

답변:


21

문제는 다소 유사하다 있는 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이 루트로 실행 중이고 콘솔에 로그인 한 사용자의 세션과 통신하려는 경우 루트 로 다른 사용자의 데스크탑에서 그래픽 프로그램을 시작할 수 있습니까?를 참조하십시오 .


2

그놈 세션 관리자의 pid를 알고 있다면 /proc파일 시스템 에서 환경을 읽습니다 .

GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"

그런 다음 notify-send 또는 dbus * 도구와 같은 다른 프로그램과 함께 SESSION ID를 사용하십시오.

건배.


매우 인상적이며 실제로 KDE4를 실행하고 있으므로 plasma-desktop대신 감사합니다!
데이지

1
ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

1

Vincenzo의 답변 에 대해서는 언급 할 수 없지만 KDE4에서 그의 답변이 가장 효과적이라는 것을 알았습니다.

그래도 명령을 약간 수정해야했습니다. 나를 위해 :

ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35

공지 사항 ADDRESS대문자한다.


0

예 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> 

이 솔루션의 한 가지 단점은 소프트웨어를 중지 한 후 세션이 중단 될 수 있다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.