crontab에서 xprop 실행: "디스플레이를 열 수 없습니다"

crontab에서 xprop 실행: "디스플레이를 열 수 없습니다"

방금 잘 작동하는 Bash 스크립트를 만들었습니다 xprop(일반 사용자와 루트로 실행).

#!/bin/bash
# time tracking BASH script

# current time and date
current_date=$(date --rfc-3339='seconds')

# active window id
window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2)

# active window class
wm_class=$(xprop '\t$0\n' -id $window_id WM_CLASS | cut --fields 2)

# active window name
wm_name=$(xprop '\t$0\n' -id $window_id _NET_WM_NAME | cut --fields 2)

echo '"'$current_date'", '$wm_class', '$wm_name

출력은 다음과 같습니다(일반 사용자 및 루트로 실행).

nelson@triplecero:~$ bash-scripts/time-tracking.sh
"2019-10-16 23:28:41-04:00", "konsole", "nelson@triplecero: ~ — Konsole"

일반 사용자가 스크립트를 호출했지만 crontab예상대로 작동하지 않습니다. 오류 메시지가 로그에 기록됩니다. "xprop: unable to open display ''"이는 xprop(및 모든 GUI 프로그램)가 현재 세션에서 실행되지 않을 때 표시되는 일반적인 오류 메시지입니다. 사실은 그렇지 않습니다. xprop루트(및 다른 사람의 프로그램)로 실행할 수 있기 때문입니다.

crontab(일반 사용자용)은 다음과 같습니다:

# m h  dom mon dow   command
  * *    *   *   *   /home/nelson/bash-scripts/time-tracking.sh >> /home/nelson/log/time-tracking.log 2>&1
  * *    *   *   *   window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2) 2>&1; echo $window_id >> /home/nelson/log/test.log 2>&1
 

첫 번째 줄을 실행할 때 다음 오류 메시지가 나타납니다 time-tracking.log.

xprop:  unable to open display ''
xprop:  unable to open display ''
xprop:  unable to open display ''
"2019-10-16 23:21:01-04:00", ,

두 번째는 빈 줄을 만듭니다.test.log

cron올바른 출력 대신 이러한 오류 메시지가 표시되는 데 내가 뭘 잘못하고 있습니까?

답변1

$DISPLAY환경 변수가 누락되었습니다 . 이는 GUI 세션을 초기화하는 첫 번째 프로세스에 의해 설정되며 모든 하위 프로세스에 의해 상속됩니다. 로컬 X11 세션의 경우 이 값은 일반적으로 :0.

$DISPLAY변수는 X11 애플리케이션에 X 서버에 접속하는 방법을 알려줍니다. 이 값은 :0에 있는 로컬 Unix 소켓을 사용하도록 알려줍니다 /tmp/.X11-unix/X0. 초기 연결 후 DRI(Direct Rendering Infrastructure)와 같은 고성능 액세스 방법을 활성화할 수 있습니다.

Cron 작업은 GUI 세션과 독립적으로 실행되어야 하기 때문에 자동으로 변수를 가져오지 않습니다 $DISPLAY. 작업 소유자가 현재 로그인되어 있지 않으면 어떻게 되나요? cron 작업이 다른 사람의 X11 세션에 액세스할 수 있는 경우 사용자는 서로를 감시할 수 있으며 이는 완전히 용납할 수 없습니다.

$XAUTHORITY사용 중인 배포판에 따라 환경 변수를 설정해야 할 수도 있습니다 . 이것이 없으면 모든 X11 도구와 응용 프로그램은 X11 세션 쿠키가 있다고 가정 $HOME/.Xauthority하지만, 예를 들어 데비안 10은 $TMP각 사용자에게 개인 디렉터리를 제공하므로 DISPLAY 로 설정 $TMP됩니다 ./tmp/user/<user's UID number>$XAUTHORITY$TMP/xauth-<user's UID number>-_0:0

올바른 X11 세션 쿠키에 액세스할 수 없는 경우 X11 서버는 루트에 대한 요청에도 응답하지 않습니다. GUI 프로그램은 /session에 전달되고, 일반 사용자로 로그인한 다음 루트를 사용하거나 루트가 되는 경우 su실행될 수 있습니다 sudo. 이는 일반적으로 기본적으로 발생하도록 설정됩니다.$DISPLAY$XAUTHORITYsusudo

관련 정보