LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1670|回复: 11

lxde能否实现系统空闲一段时间自动挂起?

[复制链接]
发表于 2010-9-27 23:29:22 | 显示全部楼层 |阅读模式
如题,希望在lxde环境下不使用gnome-power-manager、hal、dbus实现系统、显示器定时休眠。
lxde推荐暂时用gnome-power-manager,但这家伙牵涉太多(hal、dbus、consolekit),机器配置低希望能找到更轻量级的解决方案,希望用过的同学介绍一下这方面经验……

开始可能没说清要求,明确一下:
需求1:提供电源管理配置界面,类似gnome-power-manager或者windows下的设置方式
需求2:后台电源管理守护程序,不依赖dbus、hal
发表于 2010-9-28 02:18:45 | 显示全部楼层
不关hal的事。。dbus和consolekit都是趋势,凡是涉及到管理员权限的操作,使用consolekit或者polkit和dbus是最安全的。。

如果只是想定时显示器关闭,直接修改xorg.conf就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-28 05:58:32 | 显示全部楼层
Post by jarryson;2113634
不关hal的事。。dbus和consolekit都是趋势,凡是涉及到管理员权限的操作,使用consolekit或者polkit和dbus是最安全的。。

如果只是想定时显示器关闭,直接修改xorg.conf就可以了。


其实就想让机器空闲一段时间后显示器进入节能状态,再过一段时间系统也自动挂起(执行pm-suspend的效果)。前者已通过修改xorg.conf实现,但希望能有个图形界面让用户任意调整休眠时间。

http://wiki.lxde.org/en/Google_S ... er_Manager_for_LXDE 提到说
Power manager is always lacking for LXDE. Currently we borrowed gnome-power-manager...

而gnome-power-manager中仅仅gpm-brightness-hal.c通过dbus访问hal创建亮度控制dbus接口而已,为此就要引入hal确实不爽,希望能有一个更简洁的方案来设置、管理系统节能参数。
回复 支持 反对

使用道具 举报

发表于 2010-9-28 14:53:13 | 显示全部楼层
gpm我这里并不依赖hal啊。当然我的屏幕亮度不能通过软件管理。直接通过bios,所以不知道亮度如何处理
回复 支持 反对

使用道具 举报

发表于 2010-9-28 15:23:56 | 显示全部楼层
事实上, Xdefaults也可以实现.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-28 16:56:46 | 显示全部楼层
楼上能否再说仔细点,Xdefaults是用来配置X程序资源吧,安装哪个包或者去哪里下载什么源码编译?
回复 支持 反对

使用道具 举报

发表于 2010-9-28 17:23:14 | 显示全部楼层
xset s  1234
是设置屏幕保护的。

xset dpms 12 34 56
是设置挂起的。

具体可以man一下xset
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-28 20:16:33 | 显示全部楼层
Post by fjfb;2113668
xset s  1234
是设置屏幕保护的。

xset dpms 12 34 56
是设置挂起的。

具体可以man一下xset


这些是针对显示器DPMS的设置,我已经写在xorg.conf里面了。
现在想实现类似windows和gnome-power-preferences的电源管理设置界面,可以分别设置显示器、硬盘、系统挂起时间。
系统挂起是指pm-suspend,前面可能没说明白。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-1 06:27:13 | 显示全部楼层
找了几天没发现合适的,参照xscreensaver的思路弄了个简陋版。少做桌面开发方法可能比较蠢,有更好思路还请赐教。

原以为X server有统一方法让应用程序了解当前用户一段时间内是否活动,看过xscreensaver代码才发现没那么单纯,检测系统空闲、非空闲通常有以下几种渠道:
1、通过某些X扩展协议
2、hook新窗口创建消息,监听键盘、鼠标事件
3、监听自身X消息
4、读取/proc/interrupts中断计数

前三种要写C程序,第四种用脚本可实现,刚好系统里有这样定期轮询的脚本,增加一个模块即可,思路如下:

/proc/interrups中每条中断统计信息都包含了中断源、中断号以及中断计数,其中键盘、鼠标消息来源于i8042(PS/2键盘鼠标),只要定期采样比较这几组数字就可以了解系统是否空闲(我的电脑多数用PS/2,一台用串口鼠标增加8250中断监视即可)。
再将空闲时长划分成几个等级,根据配置让屏幕节能(调用xset),关闭硬盘(参照vmstat获取块计数调用hdparm -Y),调用pm-suspend挂起系统。
唤醒分几种情况,系统未挂起之前只要调用xset取消dpms,硬盘挂起可以自动唤醒不用处理,系统挂起之后的唤醒中断源需要在bios里配置好。
这里用了个简单优化,监视系统空闲的轮询间隔可以比较长,但监视唤醒事件的间隔就要相对短,否则唤醒不灵敏。

配置界面用shell调用xdialog,以前用过ncurses的dialog学起来还算容易。不过这种方法有个缺陷,就是看电影时会自己挂起,因为没用到X扩展无法知道其他程序的运行状况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-1 19:02:25 | 显示全部楼层
才发现,其实sleepd基本就符合我的要求,实现思路和我的脚本也几乎一样:https://bbs.archlinux.org/viewtopic.php?id=98965不过从aur直接构建的版本启动后直接退出。

strace跟踪发现,sleepd访问/proc/acpi/battery以及/proc/acpi/ac_adapter获取当前电源模式,但我的内核没有编译/proc/acpi支持(内核不推荐特性),所以ac模块加载失败,不存在上述proc入口。

研究一下sleepd源码,因为作者耍了一个小聪明
if (acpi_batt_count == 0) {
                        /* Where else would the power come from, eh? ;-) */
假设没有电池就肯定是交流供电模式,前提是要增加--ac-unused=睡眠时间参数。

因此内部逻辑并没有用到这两个proc入口,只要屏蔽掉sleepd.c检查失败退出代码就可以正常运行(643行):
        else {
            fprintf(stderr, "sleepd: no APM or ACPI support detected\n");
            //exit(1);
        }

arch系统配置/etc/conf.d/sleepd:
# This is a configuration file for /etc/rc.d/sleepd

# Parameters to pass to sleepd

# --unused=number_of_seconds_idling_before_sleep (default=600)
# --ac-unused=number_of_seconds_idling_on_AC_before_sleep (default=)
# --battery=percentage_below_which_to_sleep_or_hibernate
# --sleep-command=... (with acpi, defaults to hibernate --force)
# --hibernate-command=... (default is to use --sleep-command)

PARAMS=(
        "--unused=900"
        "--ac-unused=900"
        "--battery=2"
        "--sleep-command=/usr/sbin/pm-suspend"
        # "--sleep-command=/usr/sbin/pm-suspend --quirk-vbestate-restore"
        #"--hibernate-command=/usr/sbin/pm-hibernate"
)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表