Light Locker - 화면이 잠기거나 잠금 해제될 때 스크립트 실행

Light Locker - 화면이 잠기거나 잠금 해제될 때 스크립트 실행

XFCE 세션이 잠겨 있거나 잠금 해제된 경우 스크립트를 실행하고 싶습니다. 데스크탑이 잠겨 있거나 잠금 해제되어 있을 때 이 동작을 가로채서 일부 작업을 수행할 수 있는 방법이 있습니까?

다음 해결책을 찾았습니다.

격언의 경우 -화면이 잠기거나 잠금 해제되면 스크립트 실행

xscreensaverfor-잠금이 해제된 경우 스크립트를 어떻게 실행할 수 있나요?

하지만 저는 그것을 사용하고 light-locker있는데 화면 보호기가 없습니다. DBUS를 모니터링하려고 하는데 아무 light-locker신호도 내보내지 않는 것 같습니다.

한 가지 옵션은 수정하는 것이지만 xflock4이는 화면 잠금에만 도움이 됩니다.

해결 방법이 무엇입니까 light-locker?

답변1

확립된브렌트 로만를 사용하여 스크립트를 구현 dbus-monitor한 다음 gdbus더 깔끔한 인터페이스와 더 깔끔한 출력을 갖춘 으로 대체했습니다. 스크립트가 꽤 길기 때문에 화면 잠금 해제 시 스크립트 실행 요점을 설명하기 위해 dbus와 관련이 없는 모든 항목을 제거하겠습니다.

gdbus먼저 다음은 실행하고 화면을 잠근 후 화면 잠금을 해제하는 출력 예입니다.

paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2
Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1
The name org.freedesktop.login1 is owned by :1.6
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <false>}, @as [])
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock ()
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock ()
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <true>}, @as [])

따라서 스크립트 뼈대는 다음과 같습니다.

OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID
BUS_NAME=org.freedesktop.login1
UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()"
GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH"
PROGNAME=$(basename "$0")
LOGFILE=~/log/$PROGNAME.log

# ...

function log {
    echo "$(date +'%F %T.%3N') [$$]" "$@"
}

# ...

function run_daemon {
    exec &>>"$LOGFILE"

    kill_running "$GDBUS_MONITOR"

    local signal
    while read -r signal; do
        log "$signal"
        if [[ $signal == "$UNLOCK" ]]; then
            check_quodlibet
        fi
    done < <(eval "exec $GDBUS_MONITOR")
}

# ...

run_daemon

이 함수는 kill_running실행 중인 인스턴스가 있는지 확인하고 인스턴스를 종료합니다. lightdm이 로그인할 때마다 스크립트가 자동으로 시작되면 여러 인스턴스가 실행 중일 수 있으므로 시작하기 전에 현재 인스턴스를 모두 종료해야 합니다.

기능 check_quodlibet재시작쿼드리벳마운트된 USB 장치(내 음악 컬렉션 포함)가 재설정된 경우(일시 중단에서 다시 시작한 후 무작위로 발생) 포함시키는 것은 적절하지 않다고 생각합니다.

exec런타임은 gdbus꼭 필요한 것은 아니지만 스크립트가 실행되기 전에 자체적으로 분기되므로 추가 프로세스가 생성되는 것을 방지합니다 gdbus. 이렇게 하면 스크립트 자체와 2개의 프로세스만 실행됩니다 gdbus.

내가 만든다~/.config/autostart/quodr.desktop(구델는 스크립트의 이름입니다) lightdm이 로그인할 때마다 스크립트를 시작하려면 다음을 수행하세요.

[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false

나 자신을 위한 참고 사항: D-Bus 활성화 시스템 사용자 서비스로 스크립트를 시작하는 방법을 살펴보겠습니다.

이 질문과 그에 대한 모든 답변은 제가 이 솔루션을 찾는 데 매우 중요했습니다. 이 문제는 오랫동안 저를 괴롭혔고 많은 해결책을 시도했지만 여기에서 모두가 쓴 내용을 읽은 후에 필요한 것이 무엇인지 더 명확하게 알 수 있었습니다. 특히 모두에게 감사드립니다. 브렌트 로만.

마지막 코멘트로, 구축하고 설치했습니다.D 피트그리고바쁘다내가 이것을 조사했을 때 그들은 정말 도움이 되었습니다.

나는 뛰고있어주분투 17.10.

답변2

이전 답변은 현재 세션에 대한 잠금 및 잠금 해제 세션 이벤트를 처리하기 위해 이 bash 스크립트 조각을 작성하는 데 도움이 되었습니다. 세션이 잠겨 있을 때 브라우저 프로세스를 일시 중지하고 세션이 잠금 해제되면 다시 시작하는 데 이 기능을 사용합니다. 불안정한 데비안(Xfce 4.12)에서 테스트되었습니다. 즐겨보세요!

session=/org/freedesktop/login1/session/$XDG_SESSION_ID
iface=org.freedesktop.login1.Session
dbus-monitor --system "type=signal,path=$session,interface=$iface" 2>/dev/null |
 while read signal stamp sender arrow dest rest; do
  case "$rest" in
    *Lock)
      echo   LOCKED at $stamp
      pause $@
;;
    *Unlock)
      echo UNLOCKED at $stamp
      resume $@
;;  #unknown Session signal received
    *)
#      echo $signal $stamp $sender $arrow $dest $rest
  esac
done

답변3

dateLight-Locker를 통해 잠그거나 잠금 해제할 때마다 다음 명령이 실행됩니다. 그런데 잠겨 있는지, 열려 있는지는 알 수 없습니다.

dbus-monitor --system "type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1/seat/seat0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" | grep --line-buffered "ActiveSession" | while read line; do date; done

인용하다:런치패드 버그 신고 댓글

관련 정보