जब मैं कुछ कम बैटरी सीमा तक पहुंचता हूं तो मैं अपने लैपटॉप को कैसे सोता हूं?


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,बैटरी के स्तर को प्राप्त करने के लिए कुछ अधिक पोर्टेबल का उपयोग करना संभव होगा । इस स्क्रिप्ट को क्रोन द्वारा हर मिनट चलाने के लिए निर्धारित किया जा सकता है। अपने crontab को संपादित करें crontab -eऔर स्क्रिप्ट जोड़ें:

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

एक अन्य समाधान यह होगा कि आप Gnome या Xfce (और अपने विंडो मैनेजर को i3 में बदलें) जैसे डेस्कटॉप वातावरण स्थापित करें। दोनों उल्लिखित डेस्टॉप एनवायरनमेंट में पावर मैनेजमेंट डेमॉन की सुविधा है जो कंप्यूटर को बंद करने की शक्ति का ख्याल रखते हैं। लेकिन मुझे लगता है कि आप जानबूझकर उनका उपयोग नहीं करते हैं और अधिक न्यूनतर समाधान की मांग कर रहे हैं।


हम्म, मैंने दौड़ने की कोशिश की sleepd -b 40और 40% अंक के बाद कुछ नहीं हुआ। मैंने भी कोशिश की sudo sleepd -b 40 -s pm-suspendऔर कुछ नहीं हुआ ...
o_o_o--

@NoamGagliardi की पुष्टि की, यह यहाँ भी काम नहीं करता है। इसके अलावा पैकेज अप्रमाणित लगता है। मैं कोशिश करता हूं कि मुझे एक बेहतर विकल्प मिल जाए और मैं अपना जवाब अपडेट कर दूं, अन्यथा मैं इसे हटा दूंगा।
मार्को

(टीआईएल " cut"।) स्क्रिप्ट काम करती है! मेरे पास है acpi | cut -f2 -d, | cut -f1 d%- मैं इसे अपने दम पर चलाने के लिए क्रोन के बारे में पढ़ूंगा। धन्यवाद!
o_o_o--

मेरे पास /sys/devices/platform/smapi/निर्देशिका नहीं है । मुझे बैटरी शक्ति का शेष प्रतिशत कहां मिल सकता है? मैं कस्टम कर्नेल 3.10 उपयोग कर रहा हूँ
मार्टिन Vegter

2
@MartinVegter यह आपके हार्डवेयर पर निर्भर करता है, आप कोशिश कर सकते हैं /sys/class/power_supply/BAT0/capacity। अन्यथा acpiकमांड का उपयोग करें ।
मार्को

6

इसके बजाय अपनी स्वयं की स्क्रिप्ट को हैक करने और यदि आप उबंटू का उपयोग कर रहे हैं जैसा कि टैग से पता चलता है, तो आप केवल अपोवर पैकेज स्थापित कर सकते हैं। यह उबंटू सहित सभी डेबियन डेरिवेटिव पर उपलब्ध होना चाहिए। डिफ़ॉल्ट रूप से यह एक कॉन्फ़िगरेशन के साथ आता है /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 जो कि सही है, लेकिन ऊपर की तरफ इलेवर करने के बजाय इसे बंद करने का चुनाव करेगा।
जॉसच

2

वर्तमान में स्वीकृत उत्तर बहुत अच्छा है, लेकिन Ubuntu 16.04 के लिए थोड़ा पुराना है:

  • बैटरी की स्थिति प्राप्त करने के आदेश बदल गए हैं।
  • काम करने के लिए अधिसूचित-भेजने के लिए आवश्यक पर्यावरण चर बदल गए हैं
  • वहां दी गई स्क्रिप्ट अब उपयोगकर्ता क्रोन से काम नहीं करती क्योंकि हाइबरनेट को रूट की आवश्यकता होती है।
  • systemctl hibernateसे अधिक पसंद किया जाता है pm-hibernate

इसलिए, यहां वह स्क्रिप्ट है जिसका मैं उपयोग करता हूं:

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

इस फ़ाइल को स्टार्टअप पर चलाने की आवश्यकता है (आपकी पसंद के किसी भी तरीके का उपयोग करके किया जा सकता है; मैं उबंटू के अंतर्निहित स्टार्टअप एप्लिकेशन का उपयोग करता हूं )।

नोट: sudo systemctl hibernate क्रोन से काम नहीं हो सकता है। इसे हल करने के लिए इसका पालन करें


0

इसे लागू करने के कई तरीके हैं, क्योंकि आपने जो भी स्थापित किया है, उसके आधार पर कई अलग-अलग बिजली प्रबंधन योजनाएं लागू की गई हैं।

यह सरल मेरे लिए किसी भी डेस्कटॉप वातावरण के बिना न्यूनतर डेबियन जेसी पर काम करता है, बस छोटे और तेज icewm विंडो प्रबंधक के साथ। (इसे नीचे ट्रिम कर दिया गया है क्योंकि अभी भी बहुत धीमी गति से है अन्यथा, और इस तरह से यह बेहतर तरीके से गनोम को बेहतर बनाता है)

विशेष रूप से, मैंने निम्नलिखित पैकेजों को स्थापित किया है: एसपीआई-नकली-नकली-एसपीआई-एकपी-सपोर्ट-बेस-एसपीआईडी-एसपीएल-बर्तन, लेकिन निम्न में से कोई भी है (उन्हें शुद्ध किया जा रहा है): गनोम * केडी * डीएसडी * uswsusp- अप-लैपटॉप-मोड-टूल्स हाइबरनेट पॉलिसीकिट -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- *यदि आप बैटरी को अधिक बार जांचने के लिए इसकी आवश्यकता है, तो आप इसका उपयोग करके प्रत्येक मिनट में बदल सकते हैं ) यह बैटरी की स्थिति (" एसीपी - बैटरी ") को प्रदूषित करेगा और xargs -riकेवल बैटरी होने के बाद कमांड निष्पादित करेगा। " डिस्चार्जिंग "(यानी, आप एसी से कनेक्ट नहीं हैं) और बैटरी की स्थिति 10%(" इंट ($ 2) <10 " ) से कम है - इसे अपनी आवश्यकताओं के अनुरूप महसूस करें)

acpi_fakekey 205डिफ़ॉल्ट रूप से KEY_SUSPENDACPI ईवेंट भेजेगा (जैसे आप सस्पेंड का अनुरोध करने वाले लैपटॉप पर एक कुंजी दबाते हैं), जो तब आपके लिए आमतौर पर जो भी करता है (कॉन्फ़िगर किया गया /etc/default/acpi-support) - मेरे लिए यह डिस्क को हाइबरनेट करता है।

आप acpi_fakekey 205निश्चित रूप से इसके बजाय अन्य कमांड का उपयोग कर सकते हैं : जैसे hibernate(हाइबरनेट पैकेज से), s2diskया s2mem(uswsusp पैकेज से), pm-suspend-hybrid(दोपहर- बर्तन पैकेज से) आदि।

BTW, मैजिक कुंजी नंबर जैसे KEY_SUSPEND = 205 ऊपर परिभाषित किए गए हैं /usr/share/acpi-support/key-constants(अन्य दिलचस्प एक शायद KEY_SLEPOS = है )


यह बहुत अच्छा लगता है! लेकिन क्रोन के बजाय सिस्टमड टाइमर के साथ इसका इस्तेमाल किया जा सकता है? ( यहां उदाहरण ) मैं सोलस ओएस पर हूं जहां क्रोन अनुपस्थित है।

@ मैट्रिकुअस मैं ऐसा अनुमान लगाता हूं, लेकिन मैं सिस्टमडे से बचता हूं इसलिए उदाहरण नहीं दे सकता। मुझे याद है कि 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। (इस विकल्प के द्वारा स्वैप स्थान आवश्यक है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.