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: