XFCE 세션이 잠겨 있거나 잠금 해제된 경우 스크립트를 실행하고 싶습니다. 데스크탑이 잠겨 있거나 잠금 해제되어 있을 때 이 동작을 가로채서 일부 작업을 수행할 수 있는 방법이 있습니까?
다음 해결책을 찾았습니다.
격언의 경우 -화면이 잠기거나 잠금 해제되면 스크립트 실행
xscreensaver
for-잠금이 해제된 경우 스크립트를 어떻게 실행할 수 있나요?
하지만 저는 그것을 사용하고 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
date
Light-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
인용하다:런치패드 버그 신고 댓글