如何在 ubuntu 17.10 中在屏幕锁定/解锁时运行脚本

如何在 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 )

但它只起作用...几次(!)....我不明白发生了什么。

我在 X-server(没有 Wayland)上使用 ubuntu 17.10 和 ubuntu 的 gnome,并尝试了 vanilla gnome,遇到了同样的问题。

我也尝试过:

dbus-monitor > out.log

查看锁定/解锁时发生的所有痕迹,但似乎没有出现该信号...只有....嗯...很少几次...

我不知道现在该怎么办,任何建议都会有帮助。

答案1

假设您正在使用 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 [])

答案2

使用 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
    

注意:如果您只对事件 lock/unlock 之一运行命令,只需注释掉该部分中的相应行即可:

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

相关内容