
cron
bash에서 구현되고 옵션을 통해 실행되는 데몬이 있는데 @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
D-Bus를 사용하여 서비스에서 세션 정보를 쿼리해 보세요 logind
. 및 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