Come posso automatizzare il mio computer Linux allo spegnimento (e preferibilmente) in determinate circostanze?


1

OK, quindi un po 'di background;

Da tempo uso Windows Home Server come dispositivo di backup, Media Server e Share Server a casa. Ho deciso che mi stava costando una grande quantità di succo e molto presto ho aggiunto il componente aggiuntivo " Lights Out " per assicurarmi che funzionasse solo come e quando necessario.

Ora sto cercando di passare a un server basato su Linux e sto cercando uno strumento / set di strumenti simili per la gestione avanzata dell'alimentazione.

Ora la domanda;

Chiunque ha ricevuto suggerimenti all-in-one (ad es. Con parti client sia per Windows e Linux e una parte server per il server Linux), oppure chiunque può semplicemente verificare che dovrò impostare da solo tutti i singoli bit per questo separatamente?

(Uno strumento simile a " SmartPower " ma per Linux sarebbe un ottimo inizio)

Risposte:


2

Sfortunatamente non hai specificato i tuoi requisiti specifici, quindi è difficile sapere esattamente di cosa hai bisogno.

Tuttavia con gli script di shell quasi tutto è possibile. Ho uno script di shell che arresta il computer, una volta che client specifici (elenco separato da spazi nella variabile CLIENTS) non sono più online e alcuni processi (elenco separato da spazi nella variabile PROCESSES) non sono in esecuzione per gli ultimi 3 controlli:

 #!/bin/sh

LOGFILE=/var/log/autoshutdown.log
CLIENTS="hanzo twix"
PROCESSES="screen"
CHECK_THRESHOLD=3
CHECK_COUNT_FILE=/tmp/autoshutdown_count

FALSE=1
TRUE=0

function log() {
    typeset message="$1"
    echo "$(date +'%Y-%m-%d %H:%M:%S')  $message" >> $LOGFILE
}

function clientsOnline() {
    typeset flag_online=$FALSE
    for client in $CLIENTS
    do
        if ping -c 1 $client 1>/dev/null 2>/dev/null
        then
            #log "Client $client is online."
            flag_online=$TRUE
        else
            #log "Client $client is offline."
            true                                                                                                         
        fi
    done                                                                                                                 

    return $flag_online                                                                                                  
}                                                                                                                        

function processRunning() {
    typeset process_flag=$FALSE                                                                                          
    for process in $PROCESSES                                                                                            
    do                                                                                                                   
        if ps -e | grep -qs $process                                                                                     
        then                                                                                                             
            #log "Process $process is running."                                                                          
            process_flag=$TRUE
        else                                                                                                             
            #log "Process $process is not running."
            true                                                                                                         
        fi                                                                                                               
    done                                                                                                                 

    return $process_flag
}

function resetShutdownCounter() {
    echo "0" > $CHECK_COUNT_FILE                                                                                         
}                                                                                                                        

function getShutdownCount() {
    if [ -r $CHECK_COUNT_FILE ]
    then
        cat $CHECK_COUNT_FILE | head -n 1
    else
        echo 0
    fi
}

function incrementShutdownCounter() {
    echo $(expr $(getShutdownCount) + 1) > $CHECK_COUNT_FILE
}

if [ $(id -u) -ne 0 ]
then
    echo "This script must be run as root user." >&2
    exit 1
fi

#log "### Starting ###"

if clientsOnline
then
    #log "At least one client is online. Reseting shutdown count."
    resetShutdownCounter
elif processRunning
then
    #log "At least one of the registered processes is running. Reseting shutdown count."
    resetShutdownCounter
else
    incrementShutdownCounter
    log "No registered client online. Shutdown counter incremented. Current value: $(getShutdownCount)"

    if [ $(getShutdownCount) -ge $CHECK_THRESHOLD ]
    then
        log "Shutdown count threshold reached. Shutting down system in 10 seconds."
        rm -f $CHECK_COUNT_FILE
        /sbin/shutdown -h 1
    fi
fi

Tutto quello che devi fare è eseguire questo script dal tuo crontab ogni 5 minuti. Quindi spegnerebbe il computer nel caso in cui le condizioni di spegnimento fossero soddisfatte per 15 minuti di seguito.


Saluti Yaba, script di esempio molto utile; abbastanza generale per me semplicemente modificare secondo necessità. Grazie
Ashimema,

Ho appena iniziato a giocare con questo ... Nella tua sceneggiatura da dove provengono realmente i "clienti"? Probabilmente è una domanda Linux di base, ma dov'è il collegamento tra il nome "Client" che usi qui e l'indirizzo fisico (IP) delle macchine client?
Ashimema,

@Ashimema ... questa è una semplice risoluzione del nome host tramite DNS o / etc / hosts. È inoltre possibile inserire un indirizzo IP anziché il nome host. Fondamentalmente il comando 'ping -c 1 $ client' deve riuscire nel caso in cui il client sia online.
Yaba,

1

In realtà, è abbastanza semplice.

Per spegnere la tua macchina Linux devi solo eseguire un '/ sbin / telinit 6' (come root!) Dalla riga di comando o da uno script. Ciò arresta tutti i processi in modo ordinato e si spegne attraverso il BIOS. Nota che questo non funziona su tutte le schede madri, ma nel 99% dei casi funziona.

Esistono molti modi per automatizzare questo ... Non conosco pacchetti automatizzati, ma non è difficile crearne uno tu stesso. Suppongo che tu stia utilizzando un server e un desktop / laptop su cui lavorare. Se, ad esempio, si desidera che il sistema Linux si spenga automaticamente dopo aver spento il desktop di Windows, è possibile scrivere uno script che esegue il ping del computer Windows ogni 5 minuti. Se il problema persiste 3 volte di seguito, spegnere la macchina. Un'altra possibilità è una pagina Web, accessibile solo dalla tua lan locale che avvia un arresto (ritardato); devi solo assicurarti che la pagina venga chiamata all'arresto di Windows. Eccetera...


Grazie JvO, questa è una risposta piuttosto utile. Mi hai aiutato a chiarire che uno strumento preconfezionato non sembra ancora esistere e mi è venuta in mente un'idea eccellente su dove potrei iniziare a creare uno script per realizzarlo (usando il ping delle macchine che necessitano di monitoraggio sul rete) Ora è ovvio che ci penso. Saluti
Ashimema,

0

Per quanto riguarda lo spegnimento in un momento specifico, puoi farlo abbastanza facilmente inserendo una voce in / etc / crontab

30 2 * * * root / sbin / shutdown -h 0

Ciò spegnerà il sistema ogni giorno alle 2:30.

Alcuni BIOS ti consentono di configurare il sistema per l'accensione in un momento specifico, che è un'altra opzione oltre alla wake-on lan.


Saluti deltaray, ho già usato crontab per simili, ma speravo di trovare uno strumento per fare un certo numero di eventi di monitoraggio simili a quello menzionato per whs. Spento monitora un "calendario" molto simile a crontab in questo momento, ma controlla anche se i computer client sono accesi o meno e utilizzano quindi l'utilizzo del server, se c'è un backup attivo in corso o in fase di avvio, se il server è subendo qualsiasi auto-manutenzione (sto cercando di utilizzare il pooling di archiviazione greyhole, quindi in Linux questo sarebbe il regime di bilanciamento dell'unità)
Ashimema,

0

Un altro meccanismo (da aggiungere alle risposte degli altri) è gnome-power-cmd.sh se stai usando Gnome:

gnome-power-cmd.sh {sospendi | spegnimento | letargo | riavvio}

Sembra usare DBUS. Non so quanto sarà utile se prevedi di eseguire un server senza Gnome.


Sembra che questo non si trovi generalmente nelle nuove distro's?
Ashimema,

@Ashimema: hai ragione, scusa. Non aggiorno la mia distribuzione da circa 2 anni. Potresti averlo già visto, ma ho trovato un modo per farlo direttamente con dbus-send . In effetti, il mio gnome-power-cmd.sh sembra un wrapper (con alcune differenze) attorno alla soluzione presentata in quel link.
Non sono sicuro il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.