Connect with us

Linux

Come spegnere il laptop FreeBSD quando la batteria è scarica


UNDopo che il mio Raspberry PI è morto, ho deciso di non acquistarne uno nuovo immediatamente. Invece, ho trasformato il vecchio laptop in un server FreeBSD. Uso questo server per Git, backup tramite snapshot ZFS, eseguendo Debian/RHEL VM utilizzando bhyve, server web side project e jail con ZFS. Funziona perfettamente, ma durante la stagione dei monsoni, l’alimentazione elettrica a casa dura per ore e il mio UPS di backup della batteria funziona solo per 15 minuti. Quindi, quando il mio laptop FreeBSD inizia a esaurire la batteria, voglio spegnerlo automaticamente per evitare improvvisi filesystem e altri problemi di corruzione.

Ottenere lo stato della batteria del tuo notebook FreeBSD da CLI

Il hw.acpi.acline variabile ci dà lo stato della linea AC. Il valore 1 significa online, 0 significa che il sistema è alimentato a batteria. Il hw.acpi.batteria.vita indica la carica della batteria per il laptop. Possiamo usare il comando sysctl come segue per ottenere quei valori:
$ sysctl hw.acpi.acline hw.acpi.battery.life
Per nascondere i nomi delle variabili, passa il -n opzione:
$ sysctl -n hw.acpi.acline hw.acpi.battery.life

Come ricevere un avviso prima dello spegnimento

Per gli avvisi e-mail, è necessario SMTPD o almeno una sorta di routing della posta tramite il server di posta dell’ISP. In altre parole, hai bisogno di Sendmail o Postfix sulla tua macchina FreeBSD. Uso assolutamente AWS SES su FreeBSD con Postfix per tutti i miei progetti collaterali. Ho usato lo stesso sul mio server di casa. Per ricevere avvisi sul mio cellulare, ho utilizzato l’API pushover. Per ulteriori informazioni, vedere come inviare/inviare messaggi a iOS e Android dalla CLI di Linux.

Script di shell per spegnere il laptop FreeBSD quando la batteria si scarica

#!/bin/sh
# Purpose: Shell script to shutdown FreeBSD laptop when running out of battery power at a certain percent
# Modified from: https://forums.freebsd.org/threads/automatic-shutdown-on-a-specific-battery-percent.14074/post-82134
#  + Added pushover ios support by nixCraft
#  + Must be run as root to shutdown the laptop
# --------------------------------------------------
 
# Who to warn
email="vivek@nixcraft.com"
# Battery level critical %
critlevel=10
# Seconds to recheck and eventually act when battery is low
sleeps=60
# Seconds to pause between script runs
loop=180
 
while true
do
 
# battery %
battery1=$( /sbin/sysctl -n hw.acpi.battery.life )
# AC plugged in?
acpower1=$( /sbin/sysctl -n hw.acpi.acline )
 
if [ ${battery1} -le ${critlevel} ] && [ ${acpower1} = "0" ]
 then
  /bin/sleep ${sleeps}
 
  battery2=$( /sbin/sysctl -n hw.acpi.battery.life  )
  acpower2=$( /sbin/sysctl -n hw.acpi.acline )
 
   if [ ${battery2} -lt ${battery1} ] && [ ${acpower2} = "0" ]
    then
     echo "Insert power plug or kill PID $$ to prevent automatic shutdown. -- $(hostname)" | /usr/bin/mail -s "Battery ${battery2} % - Will shutdown in ${sleeps} seconds" "${email}"
     # push notification to my iOS device
     # get API keys
     . /root/bin/push-to-mobile
     # send it
     push_to_mobile "$0" "Insert power plug or kill PID $$ to prevent automatic shutdown. -- $(hostname)"
 
     /bin/sleep ${sleeps}
 
      acpower3=$( /sbin/sysctl -n hw.acpi.acline )
 
      if [ ${acpower3} = "0" ]
       then /sbin/shutdown -p now
      fi
   fi
fi
 
/bin/sleep ${loop}
 
done

Come eseguire lo script della shell in background

Sto usando l’utilità demone su FreeBSD. Si stacca dal terminale di controllo ed esegue in background il programma specificato dai suoi argomenti. È come l’utilità da riga di comando nohup, che consente di eseguire un comando/processo o uno script di shell in esecuzione in background dopo il logout da una shell. Ho aggiunto il seguente lavoro a cron eseguendo il sudo crontab -e comando:

# Shutdown FreeBSD server when running out of laptop battery 
@reboot         /usr/sbin/daemon /root/bin/powerdown-when-battry-low

Il risultato

Sono abbastanza soddisfatto della mia soluzione. Ha salvato un incidente improvviso almeno due volte. Ricevo un avviso e-mail come segue:

Inoltre, avviso mobile:

Alla fine, il laptop si spegnerà se non correggo la situazione. Posso uccidere anche il PID dalla mia notifica di avviso. Una soluzione migliore sarebbe quella di ottenere un laptop o un UPS con batteria più lunga, ma non sto investendo un altro centesimo in qualcosa che si verifica 4 o 5 volte durante la stagione delle tempeste. Quindi, ho creato questa soluzione. Potrebbe esserci una soluzione migliore se usi un Gnome o KDE simile a un desktop poiché hanno la gestione dell’alimentazione integrata. Ma questo è un server, quindi non ha senso usare un desktop su di esso.

???? Ottieni i tutorial più recenti sugli argomenti SysAdmin, Linux/Unix, Open Source e DevOps tramite:


Ti e piaciuto questo articolo?
Supporta il mio lavoro, facendo una donazione!

Click to comment

Leave a Reply

Esegui l'accesso per Commentare

Di tendenza

Close Popup
Questo sito utilizza i cookie per migliorare servizi ed esperienza dei lettori. Se decidi di continuare la navigazione senza blocchi premi su Accetto, oppure continua tranquillamente la navigazione, nessun dato sulla tua navigazione verrà raccolto.
Close Popup
Privacy Settings saved!
Impostazioni

Quando visiti un sito Web, esso può archiviare o recuperare informazioni sul tuo browser, principalmente sotto forma di cookies. Controlla qui i tuoi servizi di cookie personali.

Questi cookie sono necessari per il funzionamento del sito Web e non possono essere disattivati nei nostri sistemi.

Cookie tecnici
Per utilizzare questo sito web usiamo i seguenti cookie tecnici necessari:
  • wordpress_test_cookie
  • wordpress_logged_in_
  • wordpress_sec
  • swpm_session

Google Adsense
Usiamo la pubblicità di Google solo per mantenere attivi i nostro sito. Con ip anonimizzati.

Rifiuta tutti i Servizi
Save
Accetta tutti i Servizi