AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 868723
Accepted
Byte Commander
Byte Commander
Asked: 2017-01-07 06:04:21 +0800 CST2017-01-07 06:04:21 +0800 CST 2017-01-07 06:04:21 +0800 CST

一段时间不活动后锁定屏幕,但在合上盖子时没有

  • 772

用 Unity 运行 Ubuntu 16.04,我想要那个

  • 当我 5 分钟不碰笔记本电脑时,请关闭屏幕
  • 因不活动而关闭屏幕 1 分钟后,锁定屏幕。

  • 当我合上笔记本电脑盖时,不要立即锁定屏幕,而是在 5+1 分钟(或类似时间)后,就像盖子仍然打开并锁定一样。

在System Settings → Brightness & Lock中,如果将Lock设置为ON并配置适当的时间(1 分钟),它会在因不活动而关闭后相应地锁定屏幕。但是,它也会在合上盖子时立即锁定屏幕,这是我不想要的。
将其设置为OFF使其在合上盖子时不会锁定屏幕,但也会在关闭屏幕以使其处于不活动状态后保持解锁状态。

我已经在 dconf 中将“盖子关闭动作”设置为“无”:

$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action
'nothing'
$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-battery-action
'nothing'

无论盖子位置如何,如何让 Ubuntu 仅在用户不活动的特定时间后才锁定屏幕?

laptop
  • 1 1 个回答
  • 656 Views

1 个回答

  • Voted
  1. Best Answer
    Jacob Vlijm
    2017-01-08T00:26:01+08:002017-01-08T00:26:01+08:00

    下面的背景脚本将与您描述的完全一样

    • x 秒后关闭屏幕
    • y秒后锁定屏幕

    剧本

    #!/usr/bin/env python3
    import subprocess
    import time
    
    # set screen off after x seconds
    off = 300
    # lock screen after x seconds
    lock = 360
    
    # check idle every x seconds
    res = 3
    
    def get(cmd):
        return subprocess.check_output(cmd).decode("utf-8").strip()
    
    def test(t, threshold):
        return int(t)/1000 < threshold
    
    testoff1 = True
    testlock1 = True
    
    t1 = 0
    
    while True:
        time.sleep(res)
        t2 = get("xprintidle")
        testoff2 = test(t2, off); testlock2 = test(t2, lock)
        if (testoff2, testoff1) == (False, True):
            subprocess.Popen(["xset", "dpms", "force", "off"])
        if (testlock2, testlock1) == (False, True):
            subprocess.Popen(["gnome-screensaver-command", "-l"])                
        testoff1 = testoff2; testlock1 = testlock2
    

    如何使用

    就像您提到的那样,您需要关闭现有的盖子操作:

    gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
    

    和:

    gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
    

    此外:

    gsettings set org.gnome.desktop.screensaver lock-enabled false
    

    和

    gsettings set org.gnome.desktop.session idle-delay 0
    

    因为我们现在处理自己的程序。

    然后:

    1. 该脚本使用xprintidle, 来检查空闲时间

      sudo apt-get install xprintidle
      
    2. 将脚本复制到一个空文件中,另存为set_times.py
    3. 在脚本的头部,设置关闭屏幕的空闲时间(以秒为单位):

      # set screen off after x seconds
      off = 300
      

      以及锁屏时间:

      # lock screen after x seconds
      lock = 360
      

      这些时间是相互独立设置的,您可以按您喜欢的任何顺序设置两者(先锁定,然后关闭,或相反)

      您可以设置时间“分辨率”,检查空闲时间的频率,(因此设置的时间被四舍五入):

      # check idle every x seconds
      res = 3
      

      但你也可以

    4. 测试运行它:

      python3 /path/to/set_times.py
      
    5. 如果一切正常,请将其添加到启动应用程序:Dash > Startup Applications > Add。添加命令:

      python3 /path/to/set_times.py
      

    概念解释

    • 该命令xprintidle返回当前空闲时间(无鼠标或键盘输入)
    • 然后脚本测试设置的时间是否小于定义的阈值,并将状态与几秒钟前的状态进行比较。
    • 如果状态发生变化(True --> False),可以采取任何行动。这是为两个关闭屏幕完成的,运行:

      xset dpms force off
      

      和锁屏,运行:

      gnome-screensaver-command -l
      

    笔记

    • 当然,我们也可以腾出时间关闭并锁定屏幕参数以运行脚本:

      #!/usr/bin/env python3
      import subprocess
      import time
      import sys
      
      off = int(sys.argv[1]) if len(sys.argv) > 1 else 300
      lock = int(sys.argv[2]) if len(sys.argv) > 2 else off + 60
      # check idle every x seconds
      res = int(sys.argv[3]) if len(sys.argv) > 3 else 5
      
      def get(cmd):
          return subprocess.check_output(cmd).decode("utf-8").strip()
      
      def test(t, threshold):
          return int(t)/1000 < threshold
      
      testoff1 = True
      testlock1 = True
      
      t1 = 0
      
      while True:
          time.sleep(res)
          t2 = get("xprintidle")
          testoff2 = test(t2, off); testlock2 = test(t2, lock)
          if (testoff2, testoff1) == (False, True):
              subprocess.Popen(["xset", "dpms", "force", "off"])
          if (testlock2, testlock1) == (False, True):
              subprocess.Popen(["gnome-screensaver-command", "-l"])
          testoff1 = testoff2; testlock1 = testlock2
      

      然后运行:

      python3 /path/to/set_times.py 300 360
      

      五分钟后将关闭屏幕,六分钟后锁定屏幕。

    • 脚本的额外负担为零。

    • 2

相关问题

  • 在显卡之间切换

  • 修复台式机和笔记本电脑 Ubuntu 10.04 机器中的笔记本电脑硬盘驱动器加载周期/kerchunking [关闭]

  • Thinkpad T60 闪屏

  • 如何在默认设置不起作用的笔记本电脑上使休眠/睡眠工作?

  • 如何解决联想笔记本电脑上恢复/电源问题时禁用的蓝牙?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve