화면 잠금 / 잠금 해제에서 스크립트 실행 실행하고 싶습니다. 데스크탑을 잠 그거나 잠금 해제

그놈 세션이 잠겨 있고 잠금 해제 된 경우 화면을 실행하고 싶습니다. 데스크탑을 잠 그거나 잠금 해제 할 때이를 가로 채 특정 작업을 수행 할 수있는 방법이 있습니까?



답변

Gnome-screensaver는 어떤 일이 발생하면 dbus에서 일부 신호를 방출합니다.

여기 에 문서 (일부 예제 포함).

다음을 실행하는 스크립트를 작성할 수 있습니다.

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"

그것은 당신이 언제든지 필요하면 않는 dbus-monitor잠금 해제 / 화면을 잠그기에 대한 행을 인쇄합니다.


필요한 것을 수행하는 bash 명령은 다음과 같습니다.

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
  while read x; do
    case "$x" in
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;
    esac
  done

교체 echo SCREEN_LOCKED하고 echo SCREEN_UNLOCKED필요한 것으로 교체하십시오 .


답변

우분투 14.04에서 화면 잠금 잠금 해제에 대한 DBus 이벤트가 변경되었으며 화면 잠금 및 잠금 해제 이벤트에 바인딩하기위한 새 스크립트는 다음과 같습니다.

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while true; do
    read X
    if echo $X | grep "desktop-lock" &> /dev/null; then
      SCREEN_LOCKED;
    elif echo $X | grep "desktop-unlock" &> /dev/null; then
      SCREEN_UNLOCKED;
    fi
  done
)


답변

요즘에는 LockedHint화면 보호기보다는 메시지 를 듣는 것이 좋습니다. 그렇게하면 스크린 세이버 구현에 묶이지 않습니다.

이를 수행하는 간단한 스크립트는 다음과 같습니다.

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

이것을 제공합니다 :

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])


답변

우분투 16.04 : ozma의 솔루션이 저에게는 효과가 없었지만, 이것은 다음과 같습니다 :

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" |
  while read MSG; do
    LOCK_STAT=`echo $MSG | awk '{print $NF}'`
    if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
        echo "was unlocked"
    fi
  done


답변

이미 주어진 답변을 확장합니다.

screen또는 tmux세션 내에서 스크립트를 실행하려고 하면 올바른 것을 $DBUS_SESSION_BUS_ADDRESS먼저 찾아서 dbus-monitor대신 인수로 전달해야합니다 --session. 또한 데몬으로 실행하는 경우 한 번에 하나의 인스턴스 만 실행되고 (예 : 잠금 파일 사용) 스크립트를 사용하여 스크립트를 정리합니다 trap. 다음 예제는 대부분의 최신 Gnome 환경에서 데몬으로 작동합니다 (Ubuntu GNOME 16.04에서 테스트).

#!/bin/bash
set -o nounset                # good practice, exit if unset variable used

pidfile=/tmp/lastauth.pid     # lock file path
logfile=/tmp/lastauth.log     # log file path

cleanup() {                   # when cleaning up:
    rm -f $pidfile            # * remove the lock file
    trap - INT TERM EXIT      # * reset kernel signal catching
    exit                      # * stop the daemon
}

log() {                       # simple logging format example
    echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}

if [ -e "$pidfile" ]; then    # if lock file exists, exit
    log $0 already running...
    exit
fi

trap cleanup INT TERM EXIT    # call cleanup() if e.g. killed

log daemon started...

echo $$ > $pidfile            # create lock file with own PID inside

# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)

expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here

dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \
    while read line; do
        case "$line" in
            *"boolean true"*) log session locked;;
            *"boolean false"*) log session unlocked;;
        esac
    done

cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)

이것이 효과가 없다면 아마도 다음과 같은 이유 때문일 것입니다.

  1. 당신은 그놈을 사용하지 않습니다-더 나은 DBus 시계 표현에 대한 다른 답변을 확인하십시오.
  2. 여러 DBus 행을 실행합니다 . PID를 결정적으로 만드는 방법에 대한 세부 정보 를 확인 하십시오 .

답변

Kubuntu를 사용 중이거나 KDE / 플라즈마를 데스크탑 환경으로 사용하는 경우 인터페이스 org.freedesktop.ScreenSaver를 수신해야하므로 해당 이벤트를 수신하는 스크립트는 다음과 같습니다.

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
  while read x; do
    case "$x" in
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;
    esac
  done


답변

upstart 스탠자 의 세션 작업 지원 desktop-lockdesktop-unlock이벤트 start on. 다만 관련 트리거를 사용하여 사용자의 작업의 .conf를 작성하고 아래에 전화 명령 $XDG_CONFIG_HOME/upstart/또는 $HOME/.config/upstart아래의 예처럼 :

description "some job description"
start on desktop-lock
script
        /path/to/your/executable
end script