在Unix的Python中,如何判断我是否在使用电脑或处于空闲状态?
我想写一个脚本,让它在后台进行大文件的网络上传。不过,我希望当我在使用电脑的时候,它能够暂停上传,比如通过检测网络活动、键盘活动,或者判断我没有闲置。
在Unix系统上,使用Python,检测我是否在使用电脑的最好方法是什么呢?
5 个回答
大多数Linux系统都带有ConsoleKit,这个工具可以通过DBus提供一些会话信息,其中包括一个叫做“闲置提示”的功能;这个功能在图形界面和文本登录下都能使用。
(不过,有计划要逐步淘汰ConsoleKit,把它的一些功能转移到systemd中;关于“闲置提示”这个功能的未来还没有确定。)
为了完整起见,os.stat(ttydev).st_mtime
或者 os.fstat(1).st_mtime
可以用来获取tty/pty设备的最后输入时间。
我猜你担心文件传输的网络活动会影响到用户的操作。其实你不需要担心用户是否在键盘上输入内容。真正重要的是是否有其他网络活动在进行。
以Windows为例,你可以使用后台智能传输服务。这个服务和Windows更新使用的是同一个,可以在你使用电脑的时候,不打扰你地传送更新。想要写脚本的话,可以考虑用Powershell。如果你坚持要用Python,也可以通过win32com.bits
来实现。
其他平台肯定也会有类似的服务。
这里介绍了一种在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显示和其他初始化因某种原因失败时程序意外终止。