画面のロック/ロック解除でスクリプトを実行する


54

Gnomeセッションがロックおよびロック解除されている場合、画面を実行したいと思います。デスクトップがロックまたはロック解除されたときにこれを傍受して特定のアクションを実行する方法はありますか?

回答:


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、それは私が;-)価値はそれについていくつかのsshのトリックをやって、あなたはスクリプトプログラムからGNOME画面/セッションのロックを解除するか、ロックすることができると思います
ニキルMulley

1
@Nikhil:そのために、dbusをいじる必要はありません:gnome-screensaver-command既にあります。を渡す-agnome-screensaver-command画面がロックされ、ロックを解除できます-d。とにかく、ほとんどのgnomeアプリはdbusを広範囲に使用しているため、多くの驚くべきことを行うことができます。
ペオ

1
@peoroありがとう、とても助かります!これを何らかのデーモンとして実行することもできますか?ターミナルでこれを入力すると、そのケースのdbusを監視するために開いたままにする必要があります。ログイン時にこのコマンドを実行すると、セッション全体でアクティブになります。
サンダー

1
2014年に状況は変わったと思いますか?それが空白になると、それだけで何かを示しており、:(ここからは非常に異なっている画面のみロックされていた場合、出力doesntの変化として、私はこの質問を作成しaskubuntu.com/questions/505681/...をあなたはまだいくつかあります信じています、 thx!
Aquarius Power 14

ロックイベントをキャッチするスクリプトを実行する方法は?ウォッチャーのようなちょっと。
スタークス

20

ubuntu 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でこの作業を行う方法についてのアイデアはありますか?
レイ・フォス

2
16.04でも
正常に動作

@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

Ubuntu 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

5

既に与えられた答えを拡大する。

screenまたはtmuxセッション内からスクリプトを実行しようとする場合は、$DBUS_SESSION_BUS_ADDRESS最初に正しいものを見つけて、のdbus-monitor代わりに引数として渡す必要があります--session。また、デーモンとして実行している場合は、一度に1つのインスタンスのみを実行し(ロックファイルを使用するなど)、スクリプトがを使用してクリーンアップすることを確認する必要があります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. あなたはGnomeを使用していません-より良いDBusウォッチ式については他の回答を確認してください。
  2. 複数のDBus行を実行している-PID 検出を確定的にする方法の詳細を確認してください

1
これは、ユーザーアカウントを指定してDBusセッション情報を動的に検出するために私が持っていた別の質問に実際に答えています。ここにあなたの貢献をありがとう!
ナフトゥリケイ

ありがとう。回答にソリューションをリンクして、さらに読みます。
cprn

4

Kubuntuを使用している場合、またはデスクトップ環境としてKDE / Plasmaを使用している場合、インターフェイスをリッスンする必要がある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!KDEは非常にパーソナライズ可能なデなので、これらのことをいじる必要はありません。まるで彼らが私に必要なものを予測するかのように
Ankur S

0

upstart セッションジョブのサポートdesktop-lockとスタンザのdesktop-unlockイベントstart on。以下の例のように、$XDG_CONFIG_HOME/upstart/または$HOME/.config/upstart以下の例のように呼び出す関連トリガーとコマンドを使用して、ユーザー用のジョブ.confを作成します。

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

-1

これがubuntu 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

これはうまくいきませんでした。実行が終了し、変更された状態をリッスンしないため。
スタークス

どのスクリーンセーバーを使用していますか?gnomeまたはxscreensaverですか?その味のUbuntu、Xubuntuに、Kubuntuのなどのバージョン(それが16.04でテストされました)
オズマ

ubuntu gnome 16.04
スタークス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.