[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
문제 : 사용자가 로그인 화면에서, 예를 들어, 여전히, 경우 xprintidle
와 wmctrl
바탕 화면이 아직로드되지 않기 때문에 실패합니다. 이를 피하기 위해 스크립트 시작 부분에 다음 줄을 추가했습니다.
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.Seat
및 org.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