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"의 대상이 되어 보세요창 관리자 명령. 나는 만약에창 관리자 명령이는 데스크탑이 완전히 로드되었으며 모든 "그래픽" 명령이 정상임을 의미합니다.
WM_CMD 변수는 어디에 정의되어 있나요? 라인에서 crontab
:
@reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null
하지만 "Windows 관리자 명령"은 다른 시스템 요청을 통해서도 감지될 수 있다고 생각합니다. 그러나 나에게는 crontab 파일에 WM_CMD를 정의하는 것만으로도 충분합니다.
답변1
logind
D-Bus를 사용하여 서비스에서 세션 정보를 쿼리해 보세요. 및 org.freedesktop.login1.Manager
와 같은 다양한 신호에 대한 인터페이스 가 있습니다 . 그리고 인터페이스. 세션/좌석/사용자 상태를 얻는 데 도움이 됩니다.SessionNew
SeatNew
org.freedesktop.login1.Seat
org.freedesktop.login1.User
답변2
로그인 세션 시작 스크립트를 사용하여 ~/.xprofile
일부 플래그 파일을 생성하십시오. 예 , 그런 다음 ~/.xlogin_flag
다른 스크립트의 inotifywatch
from package를 사용하여 inotify-tools
생성, 터치 또는 제거되는 것을 확인하세요.
답변3
w
명령의 출력을 확인하십시오 . LOGIN@ 필드에 로그인 유형(X 표시)이 표시됩니다.
답변4
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