web-dev-qa-db-ja.com

ubuntu 17.10で画面ロック/ロック解除でスクリプトを実行する方法

私の問題はこの質問と同じですが、ubuntu 17.10で機能させることができません。

画面ロック/ロック解除でコマンドまたはスクリプトを実行する方法

画面ロック時にキーボードのRGB設定を変更するスクリプトを実行したい。スクリプトは問題なく実行されます。問題は、ロック/ロック解除のイベントを取得することです。私はその質問で述べたように、またここで述べたように、dbus-monitorを使用してみました:

https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html

したがって、このスクリプトの実行:

#!/bin/bash

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
( while true
    do read X
    if echo $X | grep "boolean true" &> /dev/null; then
        echo "locking at $(date)" >> $HOME/time_xprofile
    Elif echo $X | grep "boolean false" &> /dev/null; then
        echo "unlocking at $(date)" >> $HOME/time_xprofile
    fi
    done )

しかし、それは機能します...数回(!)....何が起こるか理解できません。

私は、Ubuntu 17.10をXサーバー上のUbuntuのgnome(Waylandなし)で使用していますが、Vanilla gnomeを試してみましたが、同じ問題があります。

私も試してみました:

dbus-monitor > out.log

ロック/ロック解除中に発生するすべてのトレースを確認し、そのシグナルが表示されない...のみ...

何をすればいいかわからない、どんなアドバイスも役立つだろう。

4
eddieferetro

Gnomeを使用していると仮定すると、最近ではスクリーンセーバーメッセージよりも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 [])
3
Matthew

プロセスgnome-screensaver-dialogの存在を代替トリガーとして使用する

dbusが不可能であるか、何らかの理由で優先されない場合は、プロセスgnome-screensaver-dialogの存在をトリガーとして使用できます。このプロセスは、ロック画面で呼び出されます。

pythonスクリプト内:

#!/usr/bin/env python3
import psutil
import time
import subprocess

procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"

lock1 = None

while True:
    time.sleep(2)
    lock2 = procname in (p.name() for p in psutil.process_iter())
    if lock2 != lock1:
        if lock2:
            subprocess.Popen(lock_command)
            print("locked")
        else:
            subprocess.Popen(unlock_command)
            print("unlocked")
        lock1 = lock2

使い方

  1. スクリプトを空のファイルにコピーし、locktoggle.pyとして保存します
  2. ヘッドセクション:

    lock_command = "/path/to/lockscript"
    unlock_command = "/path/to/unlockscript"
    

    実行するスクリプトへのコマンドまたはパスを設定します(二重引用符は残します!)

  3. 次のコマンドを使用して、スクリプトをテスト実行します。

    python3 /path/to/locktoggle.py
    

N.B.イベントのロック/ロック解除のいずれかでのみコマンドを実行する場合は、セクションの対応する行をコメントアウトするだけです:

if lock2 != lock1:
    if lock2:
        # subprocess.Popen(lock_command)
        print("locked")
    else:
        # subprocess.Popen(unlock_command)
        print("unlocked")
3
Jacob Vlijm