Düşük pil eşiğine ulaştığında dizüstü bilgisayarımı nasıl uyuyabilirim?


24

Ubuntu kullanıyorum, ancak masaüstü ortamı yerine pencere yöneticim olarak i3'üm var.

Pilim% 0'a ulaştığında, bilgisayar aniden kapanacak, herhangi bir uyarı veya herhangi bir şey olmayacaktır.

% 4 pil, yani uyuyacak şekilde ayarlayabileceğim basit bir komut dosyası veya yapılandırma var mı?

Yanıtlar:


12

Burada pm-hibernate, pil seviyesinin belirli bir eşiğin altında olması durumunda, pil seviyesini kontrol eden ve özel bir komut çağıran küçük bir komut dosyası .

#!/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

Bu çok basit bir senaryo, ama sanırım fikri anladınız ve kolayca ihtiyaçlarınıza göre uyarlayabiliyorsunuz. Pil seviyesine giden yol sisteminizde farklı olabilir. Biraz daha taşınabilir, muhtemelen acpi | cut -f2 -d,pil seviyesini elde etmek gibi bir şey kullanmak olabilir . Bu komut dosyası her dakika çalıştırılacak şekilde cron tarafından programlanabilir. Crontab'ınızı düzenleyin crontab -eve betiği ekleyin:

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

Diğer bir çözüm de Gnome veya Xfce gibi bir masaüstü ortamı kurmak olacaktır (ve pencere yöneticinizi i3 olarak değiştirin). Bahsedilen destop ortamlarının her ikisinde de, bilgisayarı kapatmayı önleyen güç yönetimi kepçeleri bulunur. Fakat kasten onları kullanmadığınızı ve daha minimalist bir çözüm aradığınızı varsayıyorum.


Hm, koşmaya çalıştım sleepd -b 40ve% 40 işaretinden sonra hiçbir şey olmadı. Ben de denedim sudo sleepd -b 40 -s pm-suspendve hiçbir şey olmuyor ...
o_o_o--

@NoamGagliardi Onaylandı, burada da çalışmıyor. Ayrıca, paket bakımsız görünüyor. Daha iyi bir alternatif bulabilirsem ve cevabımı güncelleyebilirsem denerim, yoksa silerim.
Marco

(TIL " cut".) Komut dosyası çalışıyor! Ben acpi | cut -f2 -d, | cut -f1 d%- kendi başına çalıştırmak için cron hakkında okuyacağım. Teşekkürler!
o_o_o--

Bende /sys/devices/platform/smapi/dizin yok. Kalan pil gücü yüzdesini nerede bulabilirim? Özel çekirdek 3.10 kullanıyorum
Martin Vegter

2
@ MartinVegter Donanımınıza bağlıdır, deneyebilirsiniz /sys/class/power_supply/BAT0/capacity. Aksi halde acpikomutu kullanın.
Marco

6

Kendi komut dosyalarınızı kırmak yerine ve etiketin önerdiği şekilde Ubuntu kullanıyorsanız, sadece upower paketini kurabilirsiniz. Ubuntu dahil tüm Debian türevlerinde mevcut olmalıdır. Varsayılan olarak /etc/UPower/UPower.conf, pil seviyesi kritik değerlere ulaştığında hibrit uykuyu etkinleştiren bir konfigürasyonla gelir . Kritik seviye için varsayılan değer% 2'dir.

Diğer dağıtımların kullanıcıları için, ilgili girişler /etc/UPower/UPower.conf:

PercentageAction=2
CriticalPowerAction=HybridSleep

İşlemin yalnızca belirtilen süre kaldıktan sonra gerçekleştirilmesine izin vermek için TimeActionbirlikte kullanabilirsiniz UsePercentageForPolicy=false:

TimeAction=120

İçin geçerli değerler CriticalPowerActionvardır PowerOff, Hibernateve HybridSleep. HybridSleep ayarlanmış ancak mevcut değilse, Hazırda Bekletme kullanılacaktır. Hazırda Beklet ayarlandıysa ancak kullanılamıyorsa, PowerOff kullanılacaktır.

HybridSleep'in avantajı, takas alanınıza bellek yazmaya ek olarak, sistemi askıya almasıdır. Askıya alma işlemi hala bir miktar pil tüketecektir, ancak pil bitmeden geri gelirseniz, askıya alınmış bir sistemden kış uykusundan çok daha hızlı bir şekilde devam edebilirsiniz. Bir elektrik prizine geri dönmeden önce pilin bitmesi durumunda, gücü tekrar açtığınızda sistemi hazırda bekletme modundan çıkarabilirsiniz.


Not: HybridSleepBir takas alanının olması gerektiğini düşünüyorum .

2
Doğru olan ancak yükselen @cipricus, hazırda bekleme moduna geçemiyorsa makineyi kapatmayı seçecektir.
josch

2

Şu anda kabul edilen cevap harika, ancak Ubuntu 16.04 için biraz modası geçmiş:

  • Batarya durumunu alma komutları değişti.
  • İşe bildirim göndermek için gereken ortam değişkenleri değişti .
  • Burada verilen komut dosyası, hazırda bekleme için kök gerektirdiğinden artık kullanıcı cronundan çalışmaz.
  • systemctl hibernatetercih edilir pm-hibernate.

Yani, burada komut ben kullanımıdır:

#!/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Çalışması için gereken ortam değişkenleri bu komut dosyası kullanılarak oluşturulur :

#!/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

Bu dosyanın başlangıçta çalışması gerekir (seçtiğiniz herhangi bir yöntemle yapılabilir; Ubuntu'nun yerleşik Başlangıç ​​Uygulamalarını kullanıyorum ).

Not: sudo systemctl hibernate cron'dan çalışmayabilir. Takip Bu bunu çözmek için.


0

Ne kurduğunuza bağlı olarak uygulanan birçok farklı güç yönetimi şeması olduğu için uygulanabilecek birçok yol vardır.

Bu basit olanı benim için masaüstü ortamı olmayan minimalist Debian Jessie ile çalışıyor, sadece küçük ve hızlı icewm pencere yöneticisi ile. (Kesilmiş çünkü başka türlü çok yavaş, ve bu şekilde GNOME'u çok daha iyi bir donanımda geride bırakıyor)

Spesifik olarak, aşağıdaki paketleri kurdum: acpi acpi-fakekey acpi desteği acpi-destek tabanı acpid pm-utils ama aşağıdakilerden hiçbiri yok (bunları temizledi): gnome * kde * systemd * uswsusp laptop modu-upower hazırda bekletme ilkesi-1

Bu yüzden ben sadece bunu koymak /etc/cron.d/battery_low_check(hepsi bir satırda, okunabilirlik için bölünmüş):

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

Hızlı, düşük kaynak kullanımı ve diğer deamonlara bağlı değil (eğer aktiflerse aktif değillerse görmezden gelinecek - /usr/share/acpi-support/policy-funcsdetaylar için bakınız).

Ne yapar: 5 dakikada bir ( */5- *pili daha sık kontrol etmeniz gerekirse sadece her dakikaya değiştirebilirsiniz ), pil durumunu yok eder (" acpi - battery ") ve xargs -riyalnızca pil varsa " komutunu uygular " Boşaltma "(yani, AC'ye bağlı değilsiniz) ve batarya durumu düşüktür 10%(" int (2 $) <10 "- ihtiyaçlarınıza göre ayarlamaktan çekinmeyin)

acpi_fakekey 205varsayılan olarak KEY_SUSPENDACPI olayını gönderir (dizüstü bilgisayardaki askıya alma talebinde bulunduğunuz bir tuşa bastığınız gibi), bu genellikle sizin için ne yaparsa yapsın (yapılandırılmış /etc/default/acpi-support) - benim için diske kış uykusuna yatar.

acpi_fakekey 205Elbette yerine başka bir komut kullanabilirsiniz : like hibernate(hazırda bekleme paketinden) s2diskveya s2mem(uswsusp paketinden), pm-suspend-hybrid(pm-utils paketinden) vb.

BTW, yukarıdaki KEY_SUSPEND = 205 gibi sihirli anahtar sayıları tanımlanmıştır /usr/share/acpi-support/key-constants(diğer ilginç olan muhtemelen KEY_SLEEP = 142'dir )


bu çok hoş görünüyor! peki cron yerine systemd timer ile kullanılabilir mi? ( burada örnek ) Solus OS'tayım, cronun olmadığı yerde.

@cipricus Sanırım öyle, ama sistemden kaçınıyorum, bu yüzden örnek veremiyorum. Sistemin kendi ACPI güç işleyicileri olduğunu hatırlıyor gibiyim, bu nedenle
sistemd

teşekkürler, içeren bir alternatif buldum uname: github.com/jerrinfrncs/batterynotif/blob/master/…

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.