لینوکس و من

۶ مطلب با کلمه‌ی کلیدی «suspend» ثبت شده است

انجام Hybernate بعد از مدت مشخصی Suspend

ما معمولا در لینوکس سیستم رو suspend میکنیم. خب این کار هزینه داره و از باتری یا برق برای فعال بودن استفاده میکنه. میتونیم در آرچی ها با سرویسی که در ادامه ایجاد میکنیم به سیستم میگیم که اگر بعد از ۲ ساعت suspend کسی resume نکرد، سیستم رو hybernate کن. این طوری مصرف باتری‌مون بهینه تر میشه و منطقی تر هم هست. البته به شرطی که swap داشته باشید.

ابتدا باید سرویس مورد نظرمون رو در systemd بسازیم:
--------------------------------------------------------
sudo gedit /etc/systemd/system/suspend-to-hibernate.service
--------------------------------------------------------

[Unit]
Description=Delayed hibernation trigger
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
Documentation=https://wiki.archlinux.org/index.php/Power_management
Conflicts=hibernate.target hybrid-sleep.target
Before=sleep.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="SLEEPLENGTH=+2hour"
ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
ExecStop=-/usr/bin/sh -c '\
  alarm=$(cat $WAKEALARM); \
  now=$(date +%%s); \
  if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
     echo "hibernate triggered"; \
     systemctl hibernate; \
  else \
     echo "normal wakeup"; \
  fi; \
  echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target


و بعد سرویس رو فعال می کنیم:
1. sudo systemctl enable disable-usb-wakeup.service
2. sudo systemctl start disable-usb-wakeup.service

USB3 چرا خاموش شد؟!

امروز برای اولین بار بعد از resume شدن از suspend متوجه شدم که پورت های USB3 کار نمیکنند. چاره ی کار بجستم و مشکل حل شد. صرفا جهت یادآوری خودم مینویسم. اگه این مشکل به طور مداوم برای شما پیش میاد، یه سری به لینک منبع بزنید.
sudo rmmod xhci_hcd
sudo modprobe xhci_hcd

bluetooth بعد از resume در آرچ

Bluetooth بعد از resume از suspend از کار می‌افته. یعنی می‌افتاد! و در کل من دوست دارم که کلید خاموش/روشن کردن بلوتوث با وایرلس فرق داشته باشه. برای همین یه اسکریپتی ساختم که مخصوص خاموش/روشن کردن بلوتوث باشه. و البته اون کارهایی رو که لازمه تا بلوتوث بعد از resume کار کنه رو توش قرار دادم (رنگ قرمز)

#!/bin/sh

STAT=`cat /sys/class/rfkill/rfkill0/state`
      if [ "$STAT" = "1" ];
         then hciconfig hci0 down;
         else sudo rmmod btusb & sudo modprobe btusb & hciconfig hci0 up;
      fi

البته توجه داشته باشید که دستور sudo در اسکریپت وجود داره. برای اینکه دستور sudo بدون اینکه پسورد لازم باشه براش، اجرا بشه، باید یه کاری بکنید که در وبلاگم آموزش دادم. هرچند از لحاظ امنیتی ایراد داره. اما کسی با ما کاری نداره که ;)

روش دیگه ای که میتونیم انجام بدیم تا مشکل از کار افتادن بلوتوث برطرف بشه و نیازی به sudo نباشه، اینه که دستور rmmod btusb & modprobe btusb رو در systemd قرار بدیم که بعد از suspend اجرا بشه. (و طبیعتا اون عبارت قرمز رو هم از اسکریپتمون برداریم.) آموزش این کار هم دو سه تا نوشته پایین تر وجود داره.

بازی با سرویس ها (اجرای دستورات شما)

سلام.
هدف اصلی: خاموش کردن nvidia ion هنگام boot و بعد از resume
هدف فرعی ۱: اجرای اسکریپت مخصوص خاموش کردن nvidia ion در آدرس usr/bin/disablecard/
هدف فرعی ۲: افزایش زمان باتری و کاهش دمای سیستم!

خیلی گشتم تا این رو در آرچ پیدا کنم. توی دبیان خیلی راحت فایل اسکریپت رو میذاشتیم در یک فولدر خاصی و اون اسکریپت بعد از resume اجرا میشد. برای boot هم با crontab این کار رو انجام میدادم. اما در آرچ اینگونه نیست...
آرچ از systemd  استفاده میکنه. این ابزاریه برای کنترل سرویس های آرچ. (روی لینکش کلیک کنید تا متوجه بشید). برای اینکه اتفاق خاصی در زمان خاصی بیفته، باید اون رو تبدیل به یک سرویس کنیم و بدیمش به آرچ که بفهمه و اجراش بکنه. من زیاد جزئیات و عمق مطلب رو نمیدونم. صرفا با خوندن ویکی و چند بار آزمون و خطا موفق شدم. شما میتونید این کار رو تعمیم بدید و هر کاری که دوست دارید با سیستمتون انجام بدید.

فایل disablecard یک اسکریپت مخصوص خاموش کردن nvidia ion در لپتاپ منه (asus 1215n) که اون رو در usr/bin/ قرار دادم که با دستور sudo disablecard به طور دستی اجراش میکردم تا کارش رو انجام بده. برای اینکه این اتفاق رو تبدیل به یک سرویس کنم این کارها رو کردم.

۱- یک فایل به اسم دلخواه nvidia-off.service در این فولدر میسازیم usr/lib/systemd/system/ و این محتوی رو توش میریزیم!
[Unit]
Description=Turns off nvidia ion
After=slim.service

[Service]
ExecStart=/usr/bin/disablecard
Type=oneshot

[Install]
WantedBy=slim.service

توضیح اینکه After یعنی اینکه این سرویس بعد از اجرای چه سرویسی باید اجرا بشه؟ من لیستی از سرویسهایی رو که هنگام بوت اجرا شده بودند با دستور systemctl list-unit-files --type=service پیدا کردم. و دیدم مثلا کدوم سرویس enabled هست. گفتم بعد از اون این اتفاق بیفته! شما هم میتونید به دلخواه خودتون ببینید سیستمتون چطوری تنظیم شده.
۲- برای resume هم یک فایل به اسم دلخواه nvidia-off-resume.service در همون فولدر میسازیم و این محتوی رو توش میریزیم:
[Unit]
Description=Turns off nvidia after resume
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/bin/disablecard

[Install]
WantedBy=suspend.target
۳- حالا دستورات زیر رو یکی یکی اجرا میکنیم تا کارمون تکمیل بشه:

sudo systemctl daemon-reload
sudo systemctl enable nvidia-off-resume
sudo systemctl enable nvidia-off
و در پایان یک بار reboot میکنیم تا نتیجه رو ببینیم. که موفقیت آمیز بود! با مراجعه به ویکی آرچ میتونید کارهای پیچیده تر و جالب تری هم بکنید.

اجرای اسکریپت شما، پس از resume از suspend

ممکنه شما اسکریپتی داشته باشید که بخواید بعد از وقتی که سیستم از suspend در اومد، اجرا بشه. مثلا اسکریپتی که من باهاش nvidia optimus رو هنگام بوت خاموش میکنم، بعد از suspend عمل نمیکنه و انویدیا روشن میمونه. باید اسکریپت رو دوباره اجرا کنم تا خاموشش کنه. اما برای رفع این مشکل، کافیه فایل اسکریپتی که میخواید رو داخل این پوشه کپی کنید. و البته مجوز اجرا شدن رو هم بهش بدید...
/etc/pm/sleep.d

suspend و resume در زمان هایی که خودتون تعیین میکنید!

این بار فوق العاده ترین اسکریپتی که تا به حال پیدا کردم براتون میذارم!  داستان از چه قراره؟

 

بالاخره من هم یه نتبوک گرفتم! و PC رو دادیم خواهر کوچک جان در اتاقش کار کنه. قبلا با PC شبها شیره ی اینترنت رو میکشیدیم و میذاشتیم دانلود. (شبانه رایگان ADSL). خب PC رو از BIOS تنظیم کرده بودم سر ساعت معینی روشن میشد، کانکت میشد، تورنت باز میشد و دانلود میکرد، و سر ساعت معینی هم خاموش میشد. اما در نتبوک این تنظیمات در BIOS وجود ندارن. برای حل این مشکل و نیل به هدف شوم شیره کشی اینترنت چاره از اینترنت و لینوکس بجستم و این اسکریپت رو پیدا کردم. از اینجا دانلودش کنید. suspend_for

 

روش کار با این اسکریپت اینه که فایل مورد نظر رو با همین اسم در فولدر مثلا home یوزر خودتون قرار بدید. و با یکی از این دستور ها اجراش کنید:

 

~/suspend_for 1 hour

 

~/suspend_for 2 hours

 

~/suspend_for 1 minute

 

~/suspend_for 2 minutes

 

~/suspend_for 2 hours 30 minutes

 

معنی این دستور ها اینه که سیستم رو برای مدت مثلا یک ساعت (اولی) suspend کن و بعدش resume کن. بنابراین میتونیم اجرای این اسکریپت رو به cron بسپاریم و این کار به طور اتوماتیک خودش انجام بشه. مثلا وقتی ساعت ۷ صبح که اینترنت شبانه تموم میشه، به جای خاموش کردن سیستم، این اسکریپت اجرا بشه و سیستم رو برای مدت ۱۸ ساعت suspend نگه داره که بشه ساعت ۱ صبح فردا و resume بشه. یا به هر حال هر وقتی که بخواید این عمل اتفاق بیفته یه محاسبه کنید و زمان مورد نظر رو بهش بدید. این اسکریپت فوق العاده بود. دست سازنده اش درد نکنه. این اسکریپت برای من با اوبونتو ۱۱٫۰۴ کار کرد. اگر برای شما کار نکرد من نمیتونم راهنماییتون بکنم شرمنده.

 

نکته: حتما قبل از اجرای اسکریپت مجوز اجرا شدن رو بهش بدید.

 

منبع