我的笔记本电脑具有suspend
以下功能:
# cat /sys/power/state
freeze mem
事实上我可以以 root 身份挂起:
echo -n mem > /sys/power/state
这很好用。但是,让用户(非 root)能够挂起的最低限度的方法是什么?
我正在使用 Debian Buster,但我没有systemd
安装(我使用的是旧式 sysvinit)。而且我也没有运行 udev 守护进程(我正在使用“内核空间”udev)。
我希望以最少的附加包来实现用户挂起功能。
在早期的 Debian 版本 (Wheezy) 上,我可以安装:
- pm-utils
- 优动力
然后通过dbus发出命令。我认为事情是这样的:
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
这不再有效。现在我了解到情况upower
已经改变,Debian 中的当前版本0.99.10
不应该工作。但我upower
从 wheezy ( 0.9.17
) 安装,只是为了测试它,但这也不起作用。该dbus-send
命令给了我这个错误:
Error org.freedesktop.DBus.Error.Spawn.ChildExited: Launch helper exited with unknown return code 127
但无论如何,使用pm-utils
,upower
和dbus
可能不是最简单的设置。pm-utils
的实际目的是什么upower
?这些实用程序仅适用于 root。但作为 root,我已经可以使用 来暂停echo -n mem > /sys/power/state
。这些公用事业能带来什么额外的好处?
我看到 pm-utils 安装了很多不同的脚本。除了出具还需要办理什么手续吗echo -n mem > /sys/power/state
?
作为用户我怎样才能实现这一切?
也许编写一个简单的C
程序来写入mem
,/sys/power/state
并设置s
与实例相同的位/usr/bin/passwd
。
这是一个可行且干净的解决方案吗?或者这会被视为“肮脏”的解决方案吗?有更好的解决方案吗?
mem
除了写信给我之外,我还需要处理什么/sys/power/state
?
我需要ifdown
和ifup
网络吗?
答案1
您可以在以下位置编写一个简单的程序c
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
FILE *f;
f = fopen("/sys/power/state", "w");
if(f == NULL) {
printf("Error opening file: /sys/power/state\n");
exit(1);
}
fprintf(f,"%s","mem");
fclose(f);
}
编译它,并将二进制文件复制到/usr/local/bin/pm-suspend
.设置 setuid 位:
chmod u+s pm-suspend
答案2
您可以使用 sudo 允许在没有密码的情况下使用特定的挂起命令集:
创建一个/etc/sudoers.d/suspend
包含以下内容的文件:
Cmnd_Alias SUSPEND = /usr/bin/systemctl suspend, /usr/sbin/rtcwake ^-m mem --date [0-9+][^ ]{0,30}$, /usr/sbin/rtcwake ^-m mem -[st] [0-9]{1,11}$
yourusername ALL=NOPASSWD: SUSPEND