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를 정의하면 충분합니다.
lightdm