在Unix的Python中,如何判断我是否在使用电脑或处于空闲状态?

8 投票
5 回答
2603 浏览
提问于 2025-04-16 17:08

我想写一个脚本,让它在后台进行大文件的网络上传。不过,我希望当我在使用电脑的时候,它能够暂停上传,比如通过检测网络活动、键盘活动,或者判断我没有闲置。

在Unix系统上,使用Python,检测我是否在使用电脑的最好方法是什么呢?

5 个回答

2

大多数Linux系统都带有ConsoleKit,这个工具可以通过DBus提供一些会话信息,其中包括一个叫做“闲置提示”的功能;这个功能在图形界面和文本登录下都能使用。

(不过,有计划要逐步淘汰ConsoleKit,把它的一些功能转移到systemd中;关于“闲置提示”这个功能的未来还没有确定。)


为了完整起见,os.stat(ttydev).st_mtime 或者 os.fstat(1).st_mtime 可以用来获取tty/pty设备的最后输入时间。

2

我猜你担心文件传输的网络活动会影响到用户的操作。其实你不需要担心用户是否在键盘上输入内容。真正重要的是是否有其他网络活动在进行。

以Windows为例,你可以使用后台智能传输服务。这个服务和Windows更新使用的是同一个,可以在你使用电脑的时候,不打扰你地传送更新。想要写脚本的话,可以考虑用Powershell。如果你坚持要用Python,也可以通过win32com.bits来实现。

其他平台肯定也会有类似的服务。

10

这里介绍了一种在Unix系统中使用X11/XScreenSaver来获取空闲时间的方法:

#!/usr/bin/python
import ctypes
import os

class XScreenSaverInfo( ctypes.Structure):
  """ typedef struct { ... } XScreenSaverInfo; """
  _fields_ = [('window',      ctypes.c_ulong), # screen saver window
              ('state',       ctypes.c_int),   # off,on,disabled
              ('kind',        ctypes.c_int),   # blanked,internal,external
              ('since',       ctypes.c_ulong), # milliseconds
              ('idle',        ctypes.c_ulong), # milliseconds
              ('event_mask',  ctypes.c_ulong)] # events

xlib = ctypes.cdll.LoadLibrary('libX11.so')
display = xlib.XOpenDisplay(os.environ['DISPLAY'])
xss = ctypes.cdll.LoadLibrary('libXss.so.1')
xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
xssinfo = xss.XScreenSaverAllocInfo()
xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), xssinfo)

print "idle: %d ms" % xssinfo.contents.idle

# cleanup
xss.XCloseDisplay(display)
xss.XFree(xssinfo)

(这个内容来自“用Python获取X11空闲时间和聚焦窗口”,最初可以在thp.io找到,现在似乎只有同一作者的GitHub代码片段还在。)

后来,另一个用户在代码中添加了一个清理部分,这样可以定期调用。

正如回答中的评论所提到的,注意在调用函数时要进行适当的返回代码检查,以避免在X显示和其他初始化因某种原因失败时程序意外终止。

撰写回答