[Risolto] Aiuto per creare uno script di ibernazione

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto] Aiuto per creare uno script di ibernazione

Messaggioda slaykristian » sabato 13 maggio 2017, 22:06

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
slaykristian
Prode Principiante
 
Messaggi: 177
Iscrizione: gennaio 2007
Località: Biandronno(VA)

Re: Aiuto per creare uno script di ibernazione

Messaggioda brasil » sabato 13 maggio 2017, 22:15

Avatar utente
brasil
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 602
Iscrizione: gennaio 2011
Distribuzione: Ubuntu 16.04-Xubuntu 16.04

Re: Aiuto per creare uno script di ibernazione

Messaggioda slaykristian » domenica 14 maggio 2017, 14:25



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
Avatar utente
slaykristian
Prode Principiante
 
Messaggi: 177
Iscrizione: gennaio 2007
Località: Biandronno(VA)


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 3 ospiti