배터리 부족 임계 값에 도달했을 때 랩탑을 잠자기 상태로 만드는 방법은 무엇입니까?


24

우분투를 사용하고 있지만 데스크탑 환경 대신 창 관리자로 i3을 사용하고 있습니다.

배터리가 0 %에 도달하면 컴퓨터가 갑자기 종료되거나 경고 또는 아무것도 표시되지 않습니다.

4 % 배터리와 같이 절전 상태가되도록 설정할 수있는 간단한 스크립트 나 구성이 있습니까?

답변:


12

pm-hibernate배터리 수준이 특정 임계 값 미만인 경우 배터리 수준을 확인하고 사용자 지정 명령을 호출하는 작은 스크립트 가 있습니다.

#!/bin/sh

###########################################################################
#
# Usage: system-low-battery
#
# Checks if the battery level is low. If “low_threshold” is exceeded
# a system notification is displayed, if “critical_threshold” is exceeded
# a popup window is displayed as well. If “OK” is pressed, the system
# shuts down after “timeout” seconds. If “Cancel” is pressed the script
# does nothing.
#
# This script is supposed to be called from a cron job.
#
###########################################################################

# This is required because the script is invoked by cron. Dbus information
# is stored in a file by the following script when a user logs in. Connect
# it to your autostart mechanism of choice.
#
# #!/bin/sh
# touch $HOME/.dbus/Xdbus
# chmod 600 $HOME/.dbus/Xdbus
# env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
# echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
# exit 0
#
if [ -r ~/.dbus/Xdbus ]; then
  . ~/.dbus/Xdbus
fi

low_threshold=10
critical_threshold=4
timeout=59
shutdown_cmd='/usr/sbin/pm-hibernate'

level=$(cat /sys/devices/platform/smapi/BAT0/remaining_percent)
state=$(cat /sys/devices/platform/smapi/BAT0/state)

if [ x"$state" != x'discharging' ]; then
  exit 0
fi

do_shutdown() {
  sleep $timeout && kill $zenity_pid 2>/dev/null

  if [ x"$state" != x'discharging' ]; then
    exit 0
  else
    $shutdown_cmd
  fi
}

if [ "$level" -gt $critical_threshold ] && [ "$level" -lt $low_threshold ]; then
  notify-send "Battery level is low: $level%"
fi

if [ "$level" -lt $critical_threshold ]; then

  notify-send -u critical -t 20000 "Battery level is low: $level%" \
    'The system is going to shut down in 1 minute.'

  DISPLAY=:0 zenity --question --ok-label 'OK' --cancel-label 'Cancel' \
    --text "Battery level is low: $level%.\n\n The system is going to shut down in 1 minute." &
  zenity_pid=$!

  do_shutdown &
  shutdown_pid=$!

  trap 'kill $shutdown_pid' 1

  if ! wait $zenity_pid; then
    kill $shutdown_pid 2>/dev/null
  fi

fi

exit 0

매우 간단한 스크립트이지만 아이디어를 얻고 필요에 맞게 쉽게 조정할 수 있다고 생각합니다. 시스템에서 배터리 잔량에 대한 경로가 다를 수 있습니다. 조금 더 휴대용은 아마도 acpi | cut -f2 -d,배터리 수준을 얻는 것과 같은 것을 사용하는 것일 것입니다 . 이 스크립트는 cron에서 1 분마다 실행되도록 예약 할 수 있습니다. 로 crontab을 편집 crontab -e하고 스크립트를 추가하십시오.

*/1 * * * * /home/me/usr/bin/low-battery-shutdown

또 다른 해결책은 Gnome 또는 Xfce와 같은 데스크탑 환경을 설치하고 창 관리자를 i3으로 변경하는 것입니다. 언급 된 두 중지 환경에는 컴퓨터 전원을 관리하는 전원 관리 데몬이 있습니다. 그러나 나는 당신이 의도적으로 사용하지 않고 더 최소한의 해결책을 찾고 있다고 가정합니다.


흠, 나는 달리기를 시도했고 sleepd -b 4040 % 마크 후에 아무 일도 일어나지 않았다. 나는 또한 시도 sudo sleepd -b 40 -s pm-suspend하고 아무 일도 일어나지 않습니다 ...
o_o_o--

@NoamGagliardi 확인되었습니다. 여기에서도 작동하지 않습니다. 또한 패키지는 유지 관리되지 않은 것 같습니다. 더 나은 대안을 찾고 답변을 업데이트 할 수 있는지 확인하고, 그렇지 않으면 삭제하겠습니다.
Marco

(TIL " cut".) 스크립트가 작동합니다! 나는 가지고있다 acpi | cut -f2 -d, | cut -f1 d%-나는 cron이 독자적으로 실행되도록 읽을 것이다. 감사!
o_o_o--

/sys/devices/platform/smapi/디렉토리 가 없습니다 . 배터리 잔량의 남은 비율을 어디에서 찾을 수 있습니까? 나는 사용자 정의 커널 3.10를 사용하고 있습니다
마틴 Vegter

2
@MartinVegter 하드웨어에 따라 다릅니다 /sys/class/power_supply/BAT0/capacity. 그렇지 않으면 acpi명령을 사용하십시오 .
Marco

6

자신의 스크립트를 해킹하는 대신 태그에서 알 수 있듯이 Ubuntu를 사용하는 경우 upower 패키지를 설치하면됩니다. 우분투를 포함한 모든 데비안 파생물에서 사용할 수 있어야합니다. 기본적으로 /etc/UPower/UPower.conf배터리 수준이 임계 값에 도달하면 하이브리드 절전을 활성화 하는 구성이 제공됩니다. 위험 수준의 기본값은 2 %입니다.

다른 배포판 사용자의 경우 관련 항목 /etc/UPower/UPower.conf은 다음과 같습니다.

PercentageAction=2
CriticalPowerAction=HybridSleep

지정된 시간 만 남은 작업을 수행하기 위해 TimeAction함께 사용할 수도 있습니다 UsePercentageForPolicy=false.

TimeAction=120

유효한 값은 CriticalPowerAction이다 PowerOff, Hibernate하고 HybridSleep. HybridSleep이 설정되었지만 사용할 수없는 경우 최대 절전 모드가 사용됩니다. 최대 절전 모드가 설정되었지만 사용할 수없는 경우 전원 끄기가 사용됩니다.

HybridSleep의 장점은 스왑 영역에 메모리를 쓰는 것 외에도 시스템을 일시 중단한다는 것입니다. 일시 중단은 여전히 ​​일부 배터리를 사용하지만 배터리가 소진되기 전에 돌아 오면 최대 절전 모드보다 일시 중단 된 시스템에서 훨씬 빨리 재개 할 수 있습니다. 전원 소켓으로 돌아 가기 전에 배터리가 소진 된 경우 다시 전원을 켜면 최대 절전 모드에서 시스템을 재개 할 수 있습니다.


참고 : HybridSleep스왑 공간이 필요 하다고 생각 합니다.

2
@cipricus는 정확하지만 upower는 최대 절전 모드로 전환 할 수없는 경우 대신 시스템을 종료하도록 선택합니다.
josch

2

현재 받아 들여지는 대답은 훌륭하지만 Ubuntu 16.04의 경우 약간 구식입니다.

  • 배터리 상태를 얻는 명령이 변경되었습니다.
  • 알림 보내기 작업에 필요한 환경 변수 가 변경되었습니다 .
  • 최대 절전 모드에는 루트가 필요하므로 cron에서 제공된 스크립트는 더 이상 사용자 cron에서 작동하지 않습니다.
  • systemctl hibernate보다 선호됩니다 pm-hibernate.

그래서, 여기에 스크립트 I 사용은 다음과 같습니다

#!/usr/bin/env bash

# Notifies the user if the battery is low.
# Executes some command (like hibernate) on critical battery.
# This script is supposed to be called from a cron job.
# If you change this script's name/path, don't forget to update it in crontab !!

level=$(cat /sys/class/power_supply/BAT1/capacity)
status=$(cat /sys/class/power_supply/BAT1/status)

# Exit if not discharging
if [ "${status}" != "Discharging" ]; then
  exit 0
fi


# Source the environment variables required for notify-send to work.
. /home/anmol/.env_vars

low_notif_percentage=20
critical_notif_percentage=15
critical_action_percentage=10


if [ "${level}" -le ${critical_action_percentage} ]; then
  # sudo is required when running from cron
  sudo systemctl hibernate
  exit 0
fi

if [ "${level}" -le ${critical_notif_percentage} ]; then
  notify-send -i '/usr/share/icons/gnome/256x256/status/battery-caution.png' "Battery critical: ${level}%"
  exit 0
fi

if [ "${level}" -le ${low_notif_percentage} ]; then
  notify-send -i '/usr/share/icons/gnome/256x256/status/battery-low.png' "Battery low: $level%"
  exit 0
fi

notify-send작업에 필요한 환경 변수 는 다음 스크립트를 사용하여 작성 됩니다 .

#!/usr/bin/env bash

# Create a new file containing the values of the environment variables
# required for cron scripts to work.
# This script is supposed to be scheduled to run at startup.

env_vars_path="$HOME/.env_vars"

rm -f "${env_vars_path}"
touch "${env_vars_path}"
chmod 600 "${env_vars_path}"

# Array of the environment variables.
env_vars=("DBUS_SESSION_BUS_ADDRESS" "XAUTHORITY" "DISPLAY")

for env_var in "${env_vars[@]}"
do
    echo "$env_var"
    env | grep "${env_var}" >> "${env_vars_path}";
    echo "export ${env_var}" >> "${env_vars_path}";
done

이 파일은 시작시 실행해야합니다 (원하는 방법을 사용하여 수행 할 수 있습니다. Ubuntu의 기본 제공 시작 응용 프로그램을 사용합니다 ).

참고 : sudo systemctl hibernate cron에서는 작동하지 않을 수 있습니다. 에 따라 그것을 해결하는 방법을.


0

설치 한 항목에 따라 다양한 전원 관리 체계가 구현되어 있으므로 여러 가지 방법으로 구현할 수 있습니다.

이 간단한 방법은 작고 빠른 icewm 창 관리자를 사용하여 데스크탑 환경없이 최소한의 데비안 Jessie에서 작동합니다. (그렇지 않으면 너무 느리기 때문에 잘리지 않으며, 이렇게하면 훨씬 나은 하드웨어에서 그놈보다 성능이 뛰어납니다)

특히, 나는 다음과 같은 패키지를 설치했습니다 : acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils 그러나 다음 중 하나도 없습니다 (퍼지) : gnome * kde * systemd * uswsusp upower laptop-mode-tools 동면 정책 키트 -1

그래서 나는 이것을 이것을 /etc/cron.d/battery_low_check한 줄 에 넣고 가독성을 위해 나눕니다.

*/5 * * * *   root  acpi --battery | 
   awk -F, '/Discharging/ { if (int($2) < 10) print }' | 
   xargs -ri acpi_fakekey 205

빠르고 리소스 사용량이 적으며 다른 데몬에 의존하지 않습니다 (사실 경우 활성 상태이면 무시됩니다 /usr/share/acpi-support/policy-funcs. 자세한 내용 참조).

수행하는 작업 : 5 분마다 ( */5- *배터리를 더 자주 점검해야하는 경우 사용하여 분 단위로 변경할 수 있음 ) 배터리 상태 ( " acpi --battery ")를 폴링 하고 xargs -ri배터리가 " 방전 "(즉, AC에 연결되어 있지 않음) 배터리 상태가 10%(" int ($ 2) <10 " 보다 작음 -필요에 따라 자유롭게 조정하십시오)

acpi_fakekey 205기본적으로 KEY_SUSPENDACPI 이벤트를 보내면 대기 모드를 요청하는 랩톱에서 키를 눌렀을 때와 같이 일반적으로 수행하는 모든 작업을 수행합니다 (으로 구성됨 /etc/default/acpi-support).

acpi_fakekey 205물론 hibernate(최대 절전 패키지에서) s2disk또는 s2mem(uswsusp 패키지에서), pm-suspend-hybrid(pm-utils 패키지에서) 등과 같은 다른 명령을 사용할 수도 있습니다 .

BTW, 위의 KEY_SUSPEND = 205 와 같은 매직 키 번호 가 정의되어 있습니다 /usr/share/acpi-support/key-constants(다른 흥미로운 키는 아마도 KEY_SLEEP = 142입니다 )


아주 좋은 것 같습니다! 그러나 cron 대신 systemd timer와 함께 사용할 수 있습니까? (예 : 여기 ) 크론가없는 어디 솔 루스 OS에있어.

@cipricus 그렇게 추측하지만 systemd를 피하므로 예제를 제공 할 수 없습니다. systemd에는 자체 ACPI 파워 핸들러가 있다는 것을 기억하는 것 같습니다. systemd에 갇혀 있으면 충돌을 피하고 싶을 것입니다.
Matija Nalis

감사합니다, 나는 다른 대안을 찾았습니다 uname: github.com/jerrinfrncs/batterynotif/blob/master/…

0

: 나는 부분적으로 다른 답변에서 영감을이 솔루션, 좋아 https://github.com/jerrinfrncs/batterynotif , 즉 스크립트를 batterynotif(uname).sh.

https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh 에서 스크립트를 참조하십시오.

내 자신의 사용을 위해 명령을 사용하여 종료 대신 하이브리드 절전 모드로 들어가도록 스크립트를 변경했습니다 systemctl hybrid-sleep. 이 옵션에는 스왑 공간이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.