[Risolto] Aiuto per creare uno script di ibernazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
slaykristian
Prode Principiante
Messaggi: 177
Iscrizione: venerdì 26 gennaio 2007, 16:24
Località: Biandronno(VA)
Contatti:

[Risolto] Aiuto per creare uno script di ibernazione

Messaggio da slaykristian »

Ciao a tutti!
Premetto di non sapere programmare.
Chiedo quindi aiuto a voi su come poter creare uno script che:
- si avvii all'accesso-avvio di sistema;
- ogni tot di secondi, ciclicamente, controlla il livello di batteria e se inferiore ad un valore, esegue il comando "pm-hibernate". Se falso, ricontrolla dopo ad es. 120 secondi.

Il comando

Codice: Seleziona tutto

sudo pm-hibernate
funziona alla grande, ma il gnome-power manager sembra non usarlo, allo stesso modo, non pare possibile dire a gnome-power-manager di usarlo.
Mi costringe così, dopo aver cercato in lungo ed in largo, a creare uno script che lo faccia correttamente. Ovviamente deve essere eseguito senza la richiesta della password.

Io ringrazio chiunque saprà aiutarmi. Spero di aver postato nella sezione corretta!
Ultima modifica di slaykristian il domenica 14 maggio 2017, 13:49, modificato 1 volta in totale.
Blog
Skype id: slaykristian
Avatar utente
brasil
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 799
Iscrizione: sabato 8 gennaio 2011, 0:27
Distribuzione: Ubuntu 18.04

Re: Aiuto per creare uno script di ibernazione

Messaggio da brasil »

Avatar utente
slaykristian
Prode Principiante
Messaggi: 177
Iscrizione: venerdì 26 gennaio 2007, 16:24
Località: Biandronno(VA)
Contatti:

Re: Aiuto per creare uno script di ibernazione

Messaggio da slaykristian »

Ti ringrazio sei stato gentilissimo! Grazie ai link che mi hai suggerito, ho cercato di sistemare la situazione e condivido qui:

dunque, il problema del mio notebook era che, dato che uso linux per fare musica a livello amatoriale, ho voluto compilare tempo fa un kernel che fosse realtime (non lowlatency) e che avesse la funzione "hibernate" funzionante.
Così ho fatto, il kernel è una bomba, e registro/suono senza xrun fastidiosi di scheda a latenza praticamente assente.
Solo che sono capriccioso. Siccome sono convinto che il mac sia un affare per modaioli spesso ignoranti, voglio avere una macchina che non abbia nulla da invidiargli. Quindi mancava la funzione iberna.
Compilando il kernel, questa funziona.
Su ubuntu studio 16.04 a 64bit, seguendo le varie guide ho impostato Unity per avere il pulsante Iberna nelle opzioni di spegnimento. Peccato che Unity utilizzi il comando sbagliato per ibernare, se non ho capito male:

Codice: Seleziona tutto

systemctl hibernate
anzichè:

Codice: Seleziona tutto

sudo pm-hibernate
Quest'ultimo funziona alla grande senza problema alcuno.
Quindi, il discorso è che così come il pulsante non funziona, nemmeno la pianificazione a batteria a tot % di carica funziona. Nulla si iberna con quel comando.
Bisogna trovare il modo di far si che tutto questo venga eseguito col comando "sudo pm-hibernate".

Creando gli script. Questo è quello che ho fatto:
- sinceratevi che funzioni l'ibernazione aprendo il terminale e lanciando:

Codice: Seleziona tutto

sudo pm-hibernate
Se funziona, e avete abilitato il pulsante Iberna in Unity con guide tipo questa o più recenti, ma nulla accade, allora sappiate che l'ibernazione da voi è supportata, ma funziona solo manualmente.

Aprite il terminale e digitate questo per scrivere il primo script (sulla base di quello di Anmol Singh Jaggi):

Codice: Seleziona tutto

gedit /home/vostronomeutente/low-battery-shutdown
dove "vostronomeutente" è il vostro nome utente... E incollate:

Codice: Seleziona tutto

#!/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/[b]vostronomeutente[/b]/envv

low_notif_percentage=8
critical_notif_percentage=5
critical_action_percentage=4


if [ "${level}" -le ${critical_action_percentage} ]; then
  # sudo is required when running from cron
  sudo pm-hibernate
  exit 0
fi

if [ "${level}" -le ${critical_notif_percentage} ]; then
  notify-send -i '/usr/share/icons/gnome/256x256/status/battery-caution.png' "Batteria critica: ${level}%"
  exit 0
fi

if [ "${level}" -le ${low_notif_percentage} ]; then
  notify-send -i '/usr/share/icons/gnome/256x256/status/battery-low.png' "Battery scarica, al 4% Iberno!: $level%"
  exit 0
fi
Salvate e chiudete.
Due cose...
Servirà creare un altro script chiamato "envv". Nello script di cui sopra, cercate la riga con "vostronomeutente" in grassetto e sostituitelo col vostro nome utente.
Potete modificare le percentuali di carica critica, di carica alla quale parte l'ibernazione, il testo dei messaggi, ecc... Basta leggere bene il file.

Creiamo l'altro script:

Codice: Seleziona tutto

gedit /home/vostronomeutente/envv
E incollate:

Codice: Seleziona tutto

#!/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
salviamo e chiudiamo.
Poi creiamo un altro script che ciclicamente a distanza di 30 secondi (modificate vostronomeutente), farà la verifica dello stato della batteria:

Codice: Seleziona tutto

gedit /home/vostronomeutente/battery_hibernationx.sh
e incolliamo:

Codice: Seleziona tutto

#!/bin/bash
while true
do
    sudo /home/[b]vostronomeutente[/b]/low-battery-shutdown  

    sleep 30 # 300 seconds or 5 minutes
done
e l'ultimo script che si chiama "innesco_ibernazione" che poi diremo a gnome di far partire all'inizio (sostituite "vostronomeutente"):

Codice: Seleziona tutto

gedit /home/vostronomeutente/innesco_ibernazione
e incolliamo:

Codice: Seleziona tutto

#!/bin/bash
sleep 10
/home/[b]vostronomeutente[/b]/battery_hibernationx.sh

exit 0
Adesso rendiamoli eseguibili:

Codice: Seleziona tutto

sudo chmod +x innesco_ibernazione battery_hibernationx.sh low-battery-shutdown
Modifichiamo il Visudo in modo da non avere la richiesta password nè sugli script che abbiamo creato e nemmeno sul comando "sudo pm-hibernate", quindi:

Codice: Seleziona tutto

sudo visudo
E inseriamo:

Codice: Seleziona tutto

[b]vostroutente[/b] ALL=NOPASSWD: /usr/sbin/pm-action

[b]vostroutente[/b] ALL=NOPASSWD: /usr/lib/pm-utils/bin/pm-action

[b]vostroutente[/b] ALL=NOPASSWD: /home/[b]vostroutente[/b]/envv

[b]vostroutente[/b] ALL=NOPASSWD: /home/[b]vostroutente[/b]/low-battery-shutdown
In ultimo, diciamo a gnome, con "Applicazioni d'avvio", di far partire l'innesco... Quindi lo apriamo e aggiungiamo questa applicazione:
Nome:

Codice: Seleziona tutto

hibernate
Comando:

Codice: Seleziona tutto

/home/[b]vostroutente[/b]/innesco_ibernazione
Un po' laborioso, ma funziona. Sono convinto che in molti hanno il mio stesso problema di hibernate non funzionante...
Note:
- Per la pianificazione d'avvio, potete avviare lo script in rc.local;
- Lo script che metterete in pianificazione, funziona solo se è un ciclo finito, quindi, solo se termina con "exit 0". Per questo è stato necessario creare l'innesco che invoca e attiva il ciclo infinito di controllo dello stato di batteria. Senza questa scelta, ciclicamente non sarebbe accaduto nulla.
Ho avuto problemi con crontab a pianificare l'esecuzione dello script, quindi ho trovato questo sistema...
Blog
Skype id: slaykristian
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 16 ospiti