Berikut ini adalah skrip kecil yang memeriksa tingkat baterai dan memanggil perintah khusus, di sini pm-hibernate
, jika tingkat baterai di bawah batas tertentu.
#!/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
Ini skrip yang sangat sederhana, tetapi saya pikir Anda mendapatkan ide dan dapat dengan mudah menyesuaikannya dengan kebutuhan Anda. Jalur ke level baterai mungkin berbeda pada sistem Anda. Sedikit lebih portabel mungkin akan menggunakan sesuatu seperti acpi | cut -f2 -d,
untuk mendapatkan level baterai. Script ini dapat dijadwalkan oleh cron untuk dijalankan setiap menit. Edit crontab Anda dengan crontab -e
dan tambahkan skrip:
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
Solusi lain adalah memasang lingkungan desktop seperti Gnome atau Xfce (dan ubah window manager Anda menjadi i3). Kedua lingkungan destop yang disebutkan memiliki daemon manajemen daya yang menjaga mematikan komputer. Tapi saya berasumsi Anda sengaja tidak menggunakannya dan mencari solusi yang lebih minimalis.
sleepd -b 40
dan tidak ada yang terjadi setelah tanda 40%. Saya juga mencobasudo sleepd -b 40 -s pm-suspend
dan tidak ada yang terjadi ...cut
".) Script berfungsi! Saya punyaacpi | cut -f2 -d, | cut -f1 d%
- saya akan membaca tentang cron untuk menjalankannya sendiri. Terima kasih!/sys/devices/platform/smapi/
direktori. Di mana saya dapat menemukan persentase sisa daya baterai? Saya menggunakan kernel khusus 3.10/sys/class/power_supply/BAT0/capacity
. Kalau tidak gunakanacpi
perintah.Alih-alih meretas skrip Anda sendiri dan jika Anda menggunakan Ubuntu seperti yang disarankan tag, Anda bisa menginstal paket upower. Ini harus tersedia di semua turunan Debian termasuk Ubuntu. Secara default ia datang dengan konfigurasi di
/etc/UPower/UPower.conf
mana mengaktifkan hibrida tidur setelah tingkat baterai mencapai nilai kritis. Default untuk level kritis adalah 2%.Untuk pengguna distribusi lain, entri yang relevan
/etc/UPower/UPower.conf
adalah:Anda juga dapat menggunakan
TimeAction
bersama denganUsePercentageForPolicy=false
untuk membiarkan tindakan dilakukan setelah hanya waktu yang ditentukan yang tersisa:Nilai yang valid untuk
CriticalPowerAction
adalahPowerOff
,Hibernate
danHybridSleep
. Jika HybridSleep diatur tetapi tidak tersedia, Hibernate akan digunakan. Jika Hibernate diatur tetapi tidak tersedia, PowerOff akan digunakan.Keuntungan dari HybridSleep adalah, bahwa selain menuliskan memori ke dalam area swap Anda, itu juga menunda sistem. Penangguhan masih akan menghabiskan beberapa baterai tetapi jika Anda kembali sebelum baterai habis, Anda dapat jauh lebih cepat melanjutkan dari sistem yang ditangguhkan daripada dari yang hibernasi. Seandainya baterai benar-benar habis sebelum Anda kembali ke soket daya, Anda dapat melanjutkan sistem dari hibernasi setelah Anda memiliki daya lagi.
sumber
HybridSleep
perlu memiliki ruang swap.Jawaban yang diterima saat ini bagus, tetapi sedikit ketinggalan jaman untuk Ubuntu 16.04:
systemctl hibernate
lebih disukai daripadapm-hibernate
.Jadi, inilah skrip yang saya gunakan:
Variabel lingkungan yang diperlukan untuk
notify-send
bekerja dibuat menggunakan skrip ini :File ini perlu dijalankan pada saat startup (dapat dilakukan dengan menggunakan metode apa pun pilihan Anda; Saya menggunakan Aplikasi Startup bawaan Ubuntu ).
Catatan:
sudo systemctl hibernate
mungkin tidak berfungsi dari cron. Ikuti ini untuk menyelesaikannya.sumber
Ada banyak cara yang dapat diterapkan, karena ada banyak skema manajemen daya yang berbeda tergantung pada apa yang telah Anda instal.
Yang sederhana ini berfungsi untuk saya di Debian Jessie minimalis tanpa lingkungan desktop, hanya dengan pengelola jendela icewm kecil dan cepat. (Dipangkas karena terlalu lambat jika tidak, dan cara ini mengungguli GNOME pada perangkat keras yang jauh lebih baik)
Secara khusus, saya telah menginstal paket-paket berikut: acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils tetapi memiliki NONE dari yang berikut (setelah dibersihkan): gnome * kde * systemd * uswsusp upower laptop-mode-tools hibernate policykit-1
Jadi saya hanya memasukkan ini
/etc/cron.d/battery_low_check
(semua dalam satu baris, pisah untuk dibaca):Ini cepat, penggunaan sumber daya rendah, dan tidak bergantung pada diaken lain (jika faktanya, ia akan diabaikan jika aktif - lihat
/usr/share/acpi-support/policy-funcs
detailnya).Kegunaan: setiap 5 menit (
*/5
- Anda dapat mengganti setiap menit hanya dengan menggunakan*
jika Anda memerlukannya untuk memeriksa baterai lebih sering) ia akan mengumpulkan status baterai (" acpi --battery ") dan menjalankan perintah setelahxargs -ri
hanya jika baterai " Pengosongan "(yaitu, Anda tidak terhubung ke AC) dan status baterai kurang dari10%
(" int ($ 2) <10 "- jangan ragu untuk menyesuaikannya dengan kebutuhan Anda)acpi_fakekey 205
akan secara default mengirimKEY_SUSPEND
acara ACPI (seperti Anda menekan tombol pada laptop yang meminta penangguhan), yang kemudian akan melakukan apa pun yang biasanya dilakukan untuk Anda (dikonfigurasi dalam/etc/default/acpi-support
) - bagi saya itu akan hibernasi ke disk.Anda dapat menggunakan perintah lain alih-alih
acpi_fakekey 205
tentu saja: sepertihibernate
(dari paket hibernate),s2disk
ataus2mem
(dari paket uswsusp),pm-suspend-hybrid
(dari paket pm-utils) dll.BTW, angka kunci ajaib seperti KEY_SUSPEND = 205 di atas didefinisikan
/usr/share/acpi-support/key-constants
(yang menarik lainnya mungkin KEY_SLEEP = 142 )sumber
uname
: github.com/jerrinfrncs/batterynotif/blob/master/…Saya suka solusi ini, yang sebagian terinspirasi oleh jawaban lain: https://github.com/jerrinfrncs/batterynotif , yaitu skrip
batterynotif(uname).sh
.Lihat skrip di sini: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
Untuk penggunaan saya sendiri, saya telah mengubah skrip untuk memasukkan hybrid-sleep bukannya shut-down, dengan menggunakan perintah
systemctl hybrid-sleep
. (Swap ruang diperlukan oleh opsi ini.)sumber