화면 잠금 / 잠금 해제에서 스크립트 실행


54

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

답변:


49

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필요한 것으로 교체하십시오 .


안녕하세요 @ peoro, 스크립트 스크립트 프로그램에서 그놈 화면 / 세션 잠금을 해제하거나 잠글 수 있다고 생각합니다. ;-)
Nikhil Mulley

1
@ Nikhil : dbus를 가지고 놀 필요가 없습니다 : gnome-screensaver-command이미 있습니다. 전달 -agnome-screensaver-command당신이 잠금을 해제 해 드리겠습니다 동안은 화면을 잠글 수 있습니다 -d. 어쨌든 대부분의 그놈 앱은 dbus를 광범위하게 사용하므로 많은 놀라운 일을 할 수 있습니다.
peoro

1
@peoro 감사합니다. 대단히 도움이되었습니다! 이것을 일종의 데몬으로 실행할 수 있습니까? 이제 터미널에 입력하면 dbus를 모니터링하여 해당 케이스를 모니터링해야합니다. 로그인 할 때이 명령을 실행하고 전체 세션 중에 활성화 할 수 있습니다.
Sander

1
2014 년에 상황이 바뀌었을 것 같습니까? 화면이 잠긴 경우 출력 나던 변화, 그것은 만, 나는이 문제의 생성 :( 났을 여기에서 매우 다르다됩니다 것을 보여줍니다 askubuntu.com/questions/505681/...을 할 당신은 여전히이 생각 thx!
Aquarius Power

잠금 이벤트를 잡는 스크립트를 실행하는 방법은 무엇입니까? 감시자를 좋아합니다.
Starx

19

우분투 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
)

fedora 23에서이 작업을 수행하는 방법에 대한 아이디어?
Ray Foss

2
16.04에서도 잘 작동
Jacob Vlijm

나 : 오늘 밤 사용이 및 테스트에 대한 @JacobVlijm 감사를 녹색 조명
WinEunuuchs2Unix

6

요즘에는 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 [])

5

우분투 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

Unity에서는 작동하지만 Gnome과 관련하여 질문했습니다.
cprn 2016 년

5

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

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를 결정적으로 만드는 방법에 대한 세부 정보 를 확인 하십시오 .

1
이것은 실제로 내가 동적으로 내가 해결 한 사용자 계정 주어진 DBUS 세션 정보를 발견하기위한 한 다른 질문에 답 여기를 . 귀하의 기여에 감사드립니다!
Naftuli Kay

감사. 자세한 내용은 답변에 솔루션을 연결해 드리겠습니다.
cprn

4

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

1
당신은 KDE / 플라즈마를 사용하는 경우는 ... 알림 스크립트를 실행하기 위해 플라즈마 데스크톱 설정을 사용할 수 있습니다 Personalization>Notifications>Notifications>Screensaver.
xenoid

감사합니다 @xenoid! KDE는 개인화가 가능하므로 이러한 것들에 대해 고민 할 필요가 없습니다. 마치 내가 필요한 것을 기대하는 것처럼
Ankur S

0

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

-1

이것이 우분투 16.04에서 나를 위해 일한 것입니다.

dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
    if [[ "$LOCK_STAT" == "true" ]]; then
        echo "was locked"
    else
        echo "was un-locked"
    fi
  done

이것은 나를 위해 작동하지 않았습니다. 실행이 완료되고 상태가 변경되지 않은 상태입니다.
Starx

어떤 화면 보호기를 사용하고 있습니까? 그놈 또는 xscreensaver? 어떤 맛 우분투, xubuntu, kubuntu 등 어떤 버전 (16.04에서 테스트되었습니다)
ozma

우분투 그놈 16.04
Starx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.