Power-Management

使使用者(非root)暫停筆記型電腦的最簡單方法

  • August 16, 2021

我的筆記型電腦具有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中的curent verison0.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, upoweranddbus可能不是最簡單的設置。的實際目的是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什麼?

我需要ifdownifup網路嗎?

您可以編寫一個簡單的程序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

引用自:https://unix.stackexchange.com/questions/602325