답변:
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으로 변경하는 것입니다. 언급 된 두 중지 환경에는 컴퓨터 전원을 관리하는 전원 관리 데몬이 있습니다. 그러나 나는 당신이 의도적으로 사용하지 않고 더 최소한의 해결책을 찾고 있다고 가정합니다.
cut
".) 스크립트가 작동합니다! 나는 가지고있다 acpi | cut -f2 -d, | cut -f1 d%
-나는 cron이 독자적으로 실행되도록 읽을 것이다. 감사!
/sys/devices/platform/smapi/
디렉토리 가 없습니다 . 배터리 잔량의 남은 비율을 어디에서 찾을 수 있습니까? 나는 사용자 정의 커널 3.10를 사용하고 있습니다
/sys/class/power_supply/BAT0/capacity
. 그렇지 않으면 acpi
명령을 사용하십시오 .
자신의 스크립트를 해킹하는 대신 태그에서 알 수 있듯이 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의 장점은 스왑 영역에 메모리를 쓰는 것 외에도 시스템을 일시 중단한다는 것입니다. 일시 중단은 여전히 일부 배터리를 사용하지만 배터리가 소진되기 전에 돌아 오면 최대 절전 모드보다 일시 중단 된 시스템에서 훨씬 빨리 재개 할 수 있습니다. 전원 소켓으로 돌아 가기 전에 배터리가 소진 된 경우 다시 전원을 켜면 최대 절전 모드에서 시스템을 재개 할 수 있습니다.
현재 받아 들여지는 대답은 훌륭하지만 Ubuntu 16.04의 경우 약간 구식입니다.
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에서는 작동하지 않을 수 있습니다. 에 따라 이 그것을 해결하는 방법을.
설치 한 항목에 따라 다양한 전원 관리 체계가 구현되어 있으므로 여러 가지 방법으로 구현할 수 있습니다.
이 간단한 방법은 작고 빠른 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_SUSPEND
ACPI 이벤트를 보내면 대기 모드를 요청하는 랩톱에서 키를 눌렀을 때와 같이 일반적으로 수행하는 모든 작업을 수행합니다 (으로 구성됨 /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입니다 )
uname
: github.com/jerrinfrncs/batterynotif/blob/master/…
: 나는 부분적으로 다른 답변에서 영감을이 솔루션, 좋아 https://github.com/jerrinfrncs/batterynotif , 즉 스크립트를 batterynotif(uname).sh
.
https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh 에서 스크립트를 참조하십시오.
내 자신의 사용을 위해 명령을 사용하여 종료 대신 하이브리드 절전 모드로 들어가도록 스크립트를 변경했습니다 systemctl hybrid-sleep
. 이 옵션에는 스왑 공간이 필요합니다.
sleepd -b 40
40 % 마크 후에 아무 일도 일어나지 않았다. 나는 또한 시도sudo sleepd -b 40 -s pm-suspend
하고 아무 일도 일어나지 않습니다 ...