
방금 잘 작동하는 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
$XAUTHORITY
su
sudo