[unix] 사용자의 데스크탑이로드 될 때 스크립트에서 감지하는 방법?

bash에서 구현되고 데스크탑을 비활성 상태로 보여주는 옵션 cron@reboot옵션으로 실행되는 데몬이 있습니다 . 스크립트는 다음과 같습니다 (테스트 목적으로 타이밍이 짧음).

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ `xprintidle` -le 25000 ] && P_STATE=0
done

문제 : 사용자가 로그인 화면에서, 예를 들어, 여전히, 경우 xprintidlewmctrl바탕 화면이 아직로드되지 않기 때문에 실패합니다. 이를 피하기 위해 스크립트 시작 부분에 다음 줄을 추가했습니다.

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

따라서 스크립트는 사용자를 기다립니다 (USER 변수는 crontab 파일에서 내 사용자 이름으로 설정 됨). 그러나 사용자가 예를 들어 터미널 세션 (KDE 또는 GNOME과 같은 그래픽 세션이 아님)을 시작하면 스크립트도 계속됩니다.

사용자가 “데스크톱 모드 표시”기능이있는 “그래픽”세션에 있는지 여부를 어떻게 알 수 있습니까? 또한 “그래픽”세션이 완전히로드되고로드 중 또는 이와 유사한 프로세스가 아닌지 확인하려면 어떻게해야합니까?

내 솔루션 :
내 (비공식) 솔루션은 메인 루프에 다음 grep줄을 추가 합니다.

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

“$ WM_CMD”대상 Windows 관리자 명령 . 만약 내가 그 가정 창 관리자 명령은 시스템에서 실행되고, 그것을 바탕 화면이 완전히로드 된 의미있는 “그래픽”명령은 확실하다.

WM_CMD 변수는 어디에 정의되어 있습니까? 에서 crontab라인 :

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

그러나 다른 시스템 요청을 통해 “windows manager 명령”을 감지 할 수 있다고 생각합니다. 그러나 crontab 파일에서 WM_CMD를 정의하면 충분합니다.



답변

logind서비스 에서 세션 정보를 쿼리하려면 D-Bus를 사용하십시오 . 그것은이 org.freedesktop.login1.Manager여러 가지 같은 신호와 인터페이스 SessionNew하고 SeatNew. org.freedesktop.login1.Seatorg.freedesktop.login1.User인터페이스. 세션 / 좌석 / 사용자 상태를 얻는 데 도움이 될 수 있습니다.


답변

로그인 세션 시작 스크립트 ~/.xprofile를 사용하여 일부 플래그 파일을 작성하십시오. 이라고해도 ~/.xlogin_flag, 당신의 다른 스크립트 사용에 inotifywatch패키지 inotify-tools가 생성 접촉 또는 삭제되는 것을 볼 수 있습니다.


답변

w명령의 출력을 확인하십시오 . LOGIN @ 필드에 로그인 유형 (X 표시)이 표시됩니다.


답변

사용자가 X11에 연결되어 있는지 확인하는 가장 간단한 방법은 $HOME/.xsession-errors그래픽으로 로그인 할 때 쓰는 프로세스를 확인하는 것이므로 모든 stderr이 리디렉션됩니다.

그렇지 않으면 w@Grzegorz가 이미 제안한대로 명령을 사용하십시오 . FROM열이 시작 :하면 그래픽 세션입니다.


답변

lightdm의 런타임 디렉토리를 체크인하십시오. systemd 및 lightdm이있는 Arch에서 사용자가 로그인하면 xauthority 파일이 작성됩니다.

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

while 루프에서 이와 같은 것으로 이것을 테스트 할 수 있습니다.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue


답변