是否可以在系统进入挂起状态之前添加触发功能?

是否可以在系统进入挂起状态之前添加触发功能?

我正在尝试弄清楚是否可以添加某种脚本,在系统进入挂起状态之前触发。想法是在空闲状态之前触发一些 webhook 来存储一些信息。

答案1

连接某物吗?

挑战在于,无论存在什么钩子,无论是黑屏还是进入挂起状态,你想要运行的相关命令或脚本总是会运行得太晚,因为它会调用可能的信号。

解决方案

与往常一样,这并不意味着我们用尽了选择。如果我们禁用默认的空白屏幕/暂停选项,并将其替换为我们自己的后台脚本,我们就可以在过程中包含您想要在状态更改之前运行的命令。

怎么运行的

在下面的脚本中,您可以设置空闲时间,在此时间之后屏幕应变黑,以及系统应进入挂起状态的时间。您还可以设置要运行的命令暂停。

剧本

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

# set times for blank screen and suspend (in that order)
times = [300, 1200]
pre_command = "touch banana.txt"

# don't change anything below, *unless* changes for other distros
last_t = times[-1]
commands = ["xset dpms force off", "sudo xfce4-session-logout --suspend"]
restore = "xset dpms force on"

def gettime():
    return int(int(subprocess.check_output(
        "xprintidle"
        ).decode("utf-8").strip())/1000)

def run_command(cmd):
    # made it like this, so user can conveniently set commands
    subprocess.call(["/bin/bash", "-c", cmd])

def change(set_t, t1, t2):
    if all([t1 <= set_t, t2 > set_t]):
        if set_t == last_t:
            run_command(pre_command)
        run_command(commands[times.index(set_t)])
    elif all([t2 < set_t, t1 >= set_t]):
        run_command(restore)
        return True

t1 = gettime()

while True:
    time.sleep(2)
    t2 = gettime()
    for t in times:
        if change(t, t1, t2):
            break
    t1 = t2

如何设置

  1. 脚本需要打印空闲

    sudo apt-get xprintidle
    
  2. 将上述脚本复制到一个空文件中,另存为my_suspend.py

  3. 现在我们需要确保脚本可以使计算机进入挂起状态:在文件中添加一行sudoers

    • 从终端运行:

      sudo visudo
      
    • 添加以下行:

      ALL All=NOPASSWD: /usr/bin/xfce4-session-logout*
      

    到文件。

  4. 在脚本的头部,设置屏幕空白的时间(以秒为单位)、计算机切换到挂起状态的时间以及在挂起之前要运行的命令:

    # set times for blank screen and suspend (in that order)
    times = [300, 1200]
    pre_command = "touch banana.txt"
    

    在上面的例子中,屏幕在 5 分钟后变黑,系统在 20 分钟后挂起。显然,你想替换pre_command

    注意:注意命令周围的引号!如果您的命令还包含混合引号,请提及。

  5. 使用以下命令从终端运行脚本:

    python3 /path/to/my_suspend.py
    

    如果一切正常,请将脚本添加到启动应用程序(会话和启动>应用程序自动启动(选项卡)>添加)

笔记

该脚本是为 Xubuntu 编写的,但只有这一行:

commands = ["xset dpms force off", "sudo xfce4-session-logout --suspend"]

命令:

"sudo xfce4-session-logout --suspend"

是 Xubuntu 特有的。因此,该脚本可以轻松适用于其他发行版。

相关内容