আমার ল্যাপটপটি যখন কিছুটা কম ব্যাটারির প্রান্তে পৌঁছে যায় তখন কীভাবে আমি ঘুমাব?


24

আমি উবুন্টু ব্যবহার করছি তবে ডেস্কটপ পরিবেশের পরিবর্তে আমার উইন্ডো ম্যানেজার হিসাবে আই 3 আছে।

যখন আমার ব্যাটারি 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 -eকরুন এবং স্ক্রিপ্টটি যুক্ত করুন:

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

আর একটি সমাধান হ'ল জিনোম বা এক্সফেসের মতো একটি ডেস্কটপ পরিবেশ ইনস্টল করা (এবং আপনার উইন্ডো ম্যানেজারকে আই 3 তে পরিবর্তন করা)। উভয় উল্লিখিত ডেসটপ এনভায়রনমেন্টগুলি পাওয়ার ম্যানেজমেন্ট ডেমন বৈশিষ্ট্যযুক্ত যা কম্পিউটারটি বন্ধ করার ক্ষমতা রাখে। তবে আমি ধরে নিচ্ছি আপনি ইচ্ছাকৃতভাবে এগুলি ব্যবহার করবেন না এবং আরও সংখ্যাসূচক সমাধানের সন্ধান করছেন।


এইচএম, আমি দৌড়ানোর চেষ্টা করেছি sleepd -b 40এবং 40% চিহ্নের পরে কিছুই ঘটেনি। আমিও চেষ্টা করেছি sudo sleepd -b 40 -s pm-suspendএবং কিছুই ঘটেনি ...
o_o_o--

@ নোমগাগলিয়ার্ডি নিশ্চিত করেছেন, এটি এখানেও কাজ করে না। তদুপরি প্যাকেজটি অপ্রয়োজনীয় বলে মনে হচ্ছে। আমি চেষ্টা করি যদি আমি আরও ভাল বিকল্প খুঁজে পেতে পারি এবং আমার উত্তর আপডেট করতে পারি, অন্যথায় আমি এটি মুছে ফেলব।
মার্কো

(টিআইএল " cut"।) স্ক্রিপ্টটি কাজ করে! আমার আছে acpi | cut -f2 -d, | cut -f1 d%- আমি ক্রোন সম্পর্কে এটি নিজে চালানোর জন্য পড়ব। ধন্যবাদ!
o_o_o--

আমার /sys/devices/platform/smapi/ডিরেক্টরি নেই। আমি ব্যাটারি পাওয়ারের বাকি শতাংশটি কোথায় খুঁজে পাব? আমি কাস্টম কার্নেলটি 3.10 ব্যবহার করছি
মার্টিন ভেজিটার

2
@ মার্টিনভেগটার এটি আপনার হার্ডওয়ারের উপর নির্ভর করে আপনি চেষ্টা করতে পারেন /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একটি অদলবদল স্থান প্রয়োজন।

2
@ সিপ্রিকাস যা সঠিক তবে আপওয়ার্ড মেশিনটি হাইবারনেট না করতে পারলে তার পরিবর্তে মেশিনটি বন্ধ করতে বেছে নেবে।
জোশ

2

বর্তমানে গৃহীত উত্তরটি দুর্দান্ত তবে উবুন্টু ১ 16.০৪ এর জন্য কিছুটা পুরানো:

  • ব্যাটারির স্থিতি পেতে আদেশগুলি পরিবর্তিত হয়েছে।
  • কাজের জন্য বিজ্ঞপ্তি-প্রেরণের জন্য প্রয়োজনীয় পরিবেশের ভেরিয়েবলগুলি পরিবর্তিত হয়েছে
  • হাইবারনেট রুটের প্রয়োজন হওয়ায় সেখানে প্রদত্ত স্ক্রিপ্টটি আর ব্যবহারকারী ক্রোন থেকে কাজ করে না।
  • 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

এটি প্রয়োগ করা যেতে পারে এমন অনেকগুলি উপায় রয়েছে, কারণ আপনি যা ইনস্টল করেছেন তার উপর নির্ভর করে অনেকগুলি পাওয়ার ম্যানেজমেন্ট স্কিম বাস্তবায়িত হয়।

এই সহজটি কেবলমাত্র ছোট এবং দ্রুত আইসডিম উইন্ডো ম্যানেজারের সাথে কোনও ডেস্কটপ পরিবেশ ছাড়াই ন্যূনতম ডেবিয়ান জেসি নিয়ে কাজ করে। (এটি ছাঁটাই করা হয়েছে কারণ অন্যথায় কেবল ধীর গতির এবং এটি আরও ভাল হার্ডওয়্যারে জিনোমকে ছাড়িয়ে যায়)

বিশেষত, আমি নিম্নলিখিত প্যাকেজগুলি ইনস্টল করেছি: acpi acpi-fkeykey acpi- সমর্থন acpi- সমর্থন-বেস acpid pm-utils তবে নীচের কিছু নেই (সেগুলি মুছে ফেলা হয়েছে): জিনোম * কেডি * সিস্টেমড * ইউএসএসপউপ ল্যাপটপ-মোড-সরঞ্জামসমূহ হাইবারনেট পলিসিকিট -১

সুতরাং আমি কেবল এটি এনেছি /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" ডিসচার্জিং ("এটি আপনি এসির সাথে সংযুক্ত নন) এবং ব্যাটারির স্থিতি 10%(" ইনট ($ 2) <10 "এর চেয়ে কম ) - এটি আপনার প্রয়োজন অনুসারে নির্দ্বিধায় অনুভব করুন)

acpi_fakekey 205ডিফল্টরূপে KEY_SUSPENDএসিপিআই ইভেন্ট প্রেরণ করবে (যেমন আপনি স্থগিতের অনুরোধ করে ল্যাপটপের উপর একটি কী চাপলেন), যা এটি সাধারণত আপনার জন্য যা কিছু করবে (কনফিগার করা আছে /etc/default/acpi-support) - আমার জন্য এটি ডিস্কে হাইবারনেট করে।

আপনি acpi_fakekey 205অবশ্যই অন্য কমান্ডটি অবশ্যই ব্যবহার করতে পারেন : যেমন hibernate(হাইবারনেট প্যাকেজ থেকে), s2diskবা s2mem(ইউএসউসপ প্যাকেজ থেকে), pm-suspend-hybrid(pm-utils প্যাকেজ থেকে) ইত্যাদি

বিটিডাব্লু, উপরের KEY_SUSPEND = 205 এর মতো যাদু কী সংখ্যাগুলি সংজ্ঞায়িত করা হয়েছে /usr/share/acpi-support/key-constants(অন্যান্য আকর্ষণীয় সম্ভবত সম্ভবত KEY_SLEEP = 142 )


এটা খুব সুন্দর মনে হচ্ছে! তবে এটি কি ক্রোনের পরিবর্তে সিস্টেমেড টাইমার দিয়ে ব্যবহার করা যেতে পারে? (উদাহরণস্বরূপ এখানে ) আমি একা OS এ আছি যেখানে ক্রন অনুপস্থিত।

@ সিপ্রিকাস আমি এটি অনুমান করি, তবে আমি সিস্টেমড এড়ানো তাই উদাহরণ দিতে পারি না। আমার মনে হচ্ছে
সিস্টেমডের নিজস্ব এসিপিআই

ধন্যবাদ, আমি এর সাথে জড়িত একটি বিকল্প পেয়েছি 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.