[Risolto] spegnere server inattivo

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns e altro.
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

[Risolto] spegnere server inattivo

Messaggio da ricdata »

salve,
avrei bisogno di un tool per spegnere automaticamente un server 12.04 dopo tot minuti che il carico della cpu risulta inferiore a tot%
su ubuntu desktop avevo trovato Sentinella, che fa proprio questo lavoro alla grande, ma richiede serverX per funzionare, che sul server ovviamente non c'è. come si potrebbe fare?
Ultima modifica di ricdata il venerdì 26 luglio 2013, 13:46, modificato 1 volta in totale.
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: spegnere server inattivo

Messaggio da zdf_9 »

Io per spegnere automaticamente il computer utilizzo questi 2 script (presenti nella mia directory "/aaa-script" creata ad-hoc); in questa directory c'è un file di nome "defaultValues" che contiene solo le impostazioni alle variabili che terminano con _CMD.

il primo file è cron_user_root_autoshutdown.sh (andrà inserito nel crontab di root, io lo faccio eseguire ogni 15 minuti).

Codice: Seleziona tutto

#!/bin/bash

#in crontab
# */15 * * * * /aaa-script/cron_user_root_autoshutdown.sh

SHUTDOWN_COUNT="/tmp/autoshutdown.tmp"

if [ ! -e ${SHUTDOWN_COUNT} ]; then
  exit 0
fi

. /aaa-script/defaultValues

eseguoNum=`$CAT_CMD ${SHUTDOWN_COUNT}`
eseguoNum=$(($eseguoNum + 1))
sleep 62
cpuusage=`/aaa-script/cpu_usage.py`

if [ -e ${SHUTDOWN_COUNT} ]; then
  if [ ${cpuusage} -ge 12 ]; then
    $ECHO_CMD 0 > ${SHUTDOWN_COUNT}
  else
    if [ $eseguoNum -ge 4 ]; then
      $RM_CMD ${SHUTDOWN_COUNT}
      $SHUTDOWN_CMD -h 0
    else
      $ECHO_CMD $eseguoNum > ${SHUTDOWN_COUNT}
    fi
  fi
fi

exit 0
Il secondo è "cpu_usage.py", non mi ricordo dove l'ho scovato in rete...

Codice: Seleziona tutto

#!/usr/bin/env python2

import time

TIMEFORMAT = "%m/%d/%y %H:%M:%S"
INTERVAL = 2

def getTimeList():
  statFile = file("/proc/stat", "r")
  timeList = statFile.readline().split(" ")[2:6]
  statFile.close()
  for i in range(len(timeList)) :
    timeList[i] = int(timeList[i])
  return timeList

def deltaTime(interval) :
  x = getTimeList()
  time.sleep(interval)
  y = getTimeList()
  for i in range(len(x)) :
    y[i] -= x[i]
  return y

if __name__ == "__main__" :
  # while True :
  dt = deltaTime(INTERVAL)
  timeStamp = time.strftime(TIMEFORMAT)
  cpuPct = 100 - (dt[len(dt) - 1] * 100.00 / sum(dt))
  #print (cpuPct)
  print int(cpuPct)
  #print timeStamp + "\t" + str('%.4f' %cpuPct)
In pratica per attivare lo spegnimento automatico devi dare il comando "echo 0 > /tmp/autoshutdown.tmp", per disattivalo basta cancellare lo stesso file.

[edit]
Questo metodo controlla che il carico della cpu sia inferiore ad una certa soglia solo quando viene lanciato, non effettua un controllo continuo. Se nel momento in cui viene lanciato dal cron, per 4 volte consecutive il carico della cpu è inferiore al 12%, spegne il computer.
[/edit]
Ultima modifica di zdf_9 il martedì 2 luglio 2013, 16:00, modificato 1 volta in totale.
il nemico più grande si nasconde nell'ultimo posto dove guardi
ale4
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 761
Iscrizione: venerdì 10 agosto 2012, 17:53

Re: spegnere server inattivo

Messaggio da ale4 »

Fammi capire,dopo che hai spento il server cosa fai ? chi lo riaccende ? a me sembra non avere senso,un server deve restare sempre attivo se no è inutile,una volta spento vai te a riaccenderlo manualmente ?
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

zdf_9 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4416384#p4416384][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: [edit]
Questo metodo controlla che il carico della cpu sia inferiore ad una certa soglia solo quando viene lanciato, non effettua un controllo continuo. Se nel momento in cui viene lanciato dal cron, per 4 volte consecutive il carico della cpu è inferiore al 12%, spegne il computer.
[/edit]
in effetti mi servirebbe qualcosa che faccia un controllo costante. essendo un server ftp al quale si collegano persone poco esperte, (spiegargli come si spegne da remoto sarebbe una ulteriore complicazione, sempre che si ricordino di spegnerlo quando hanno finito), sarebbe più semplice se si spegnesse automaticamente dopo un certo periodo di inattività.
ale4 ha scritto:Fammi capire,dopo che hai spento il server cosa fai ? chi lo riaccende ? a me sembra non avere senso,un server deve restare sempre attivo se no è inutile,una volta spento vai te a riaccenderlo manualmente ?
no, lo riaccendo da remoto col wake on lan ;)
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: spegnere server inattivo

Messaggio da zdf_9 »

Ma non ti conviene controllare i log dell'ftp (o il traffico sviluppato con il comando ftpstat)? IMHO sarebbe più sicuro che affidarsi all'utilizzo della cpu.
In alternativa potresti adoperare entrambi i metodi, in modo da non spegnere il server nel momento in cui stà eseguendo i cron periodici.
Non ho mai usato il demone ftp, quindi potrei aver detto delle fesserie su ftpstat e sui dati che vengono registrati nel log.

Per il mio utilizzo domestico preferisco far lanciare lo script ogni 15 minuti (per poi aspettare 62 secondi) perchè ho altri cron che vengono lanciati in contemporanea. Con quella pausa sono sicuro che gli script (quando non hanno nulla da fare) non interfersicano con la rilevazione dell'utilizzo della cpu.

Sarebbe più funzionale creare uno script che viene eseguito all'avvio in cui, all'interno di un loop infinito, effettuare tutti i controlli del caso.
il nemico più grande si nasconde nell'ultimo posto dove guardi
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

in realtà il server non è proprio ftp, ma SSH. al momento c'è solo il servizio sftp, ma più in là potrei aver bisogno di altri servizi come samba, lamp.... poi sul server ho attivato gli aggiornamenti automatici, per cui non dovrebbe assolutamente spegnersi durante un eventuale aggiornamento. secondo me il controllo sul carico CPU è quello che potrebbe monitorare più efficacemente qualsiasi operazione stia facendo il server.
ho trovato la libreria usata da Sentinella, libsysactivity è possibile utilizzarla in qualche modo?
ale4
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 761
Iscrizione: venerdì 10 agosto 2012, 17:53

Re: spegnere server inattivo

Messaggio da ale4 »

Il controllo della cpu non è efficace,se per esempio uno sta trasferendo un file grosso la cpu la userà all' 1%,quindi si spegnerebbe,piuttosto controlla gli utenti loggati,se non c'è nessuno loggato si spegne
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

e se non c'è nessuno loggato ma sta facendo un aggiornamento?
ho già verificato il carico CPU nelle diverse condizioni, e con una calibratura precisa credo sia la soluzione migliore.
scusa se insisto, ma il log degli utenti è una condizione necessaria ma non sufficente.
ale4
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 761
Iscrizione: venerdì 10 agosto 2012, 17:53

Re: spegnere server inattivo

Messaggio da ale4 »

Se stai facendo un aggiornamento non vedo il problema,la procedura di spegnimento fa terminare correttamente il programma di aggiornamento e ricomincerà al successivo riavvio,non è un grosso problema,invece col controllo del carico della cpu la vedo più problematica,perchè non so che processore abbia ma il mio ad esempio quando non fa nulla è a 0%,potrebbe benissimo esserci un utente loggato che in quel momento non sta facendo nulla o sta facendo un operazione che non interessa la cpu come scaricare un file e verrebbe disconnesso
Se proprio vuoi essere sicuro fai uno script che oltre a controllare il numero di utenti connessi controlli anche se è in esecuzione dpkg o apt,e nel caso non arresta il pc,poi dovresti mettere nello script in ogni caso un timeout,tipo il pc si spegne se è 10 minuti che nessuno è connesso alla macchina e non sta facendo aggiornamenti,però con la percentuale della cpu è difficile mettere un timeout,dato che il processore non può stare 10 minuti a 0%
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: spegnere server inattivo

Messaggio da zdf_9 »

[edit] Esiste una nuova versione dello script in un post successivo [/edit]

Ho buttato già uno script che controlla sia il carico della cpu sia se alcuni programmi sono attivi.
Ad ogni programma è associato il numero dei processi occupati dal demone.
Con il comando "ps ax | grep ssh | grep -v grep" ottieni la lista completa per il servizio ssh (nel mio caso ho 2 linee), per cui dopo il ":" metto 2.

La versione che posto ha alcuni echo per testarne l'esecuzione, inoltre ha disabilitato lo shutdown effettivo.
Per esegurlo ha bisogno del file "/aaa-script/cpu_usage.py" che avevo già postato.
Il programma potrebbe essere migliorato aggiungendo un controllo sul traffico ethernet o altri controlli.
Se risolve il tuo problema basta eseguirlo al boot.

Codice: Seleziona tutto

#!/bin/sh

CPU_LIMIT=12
SLEEP_TIME=10s
SHUTDOWN_LIMIT=24
FLAG="/tmp/shutdownOK.tmp"
DATA="ssh:2 apt-get:0"

SHUTDOWN=0

while true; do
  if [ -e ${FLAG} ]; then 
    SHUTDOWN=$(($SHUTDOWN + 1))
    for PROGRAM_AND_NUMBER in ${DATA}; do
      PROGRAM=`/bin/echo $PROGRAM_AND_NUMBER | /usr/bin/awk -F : '{print $1}'`
      NUMBER_LIMIT=`/bin/echo $PROGRAM_AND_NUMBER | /usr/bin/awk -F : '{print $2}'`
      PROCESSI=`ps ax | grep -c ${PROGRAM}`
      PROCESSI=$(($PROCESSI - 1))
      echo "${PROGRAM} (${PROCESSI} > ${NUMBER_LIMIT})"

      if [ ${PROCESSI} -gt ${NUMBER_LIMIT} ]; then
        SHUTDOWN=0
        break;
      fi
    done
    if [ ${SHUTDOWN} -ge 1 ]; then
      CPU_USAGE=`/aaa-script/cpu_usage.py`
      echo "CPU (${CPU_USAGE} >= ${CPU_LIMIT})"
      if [ ${CPU_USAGE} -ge ${CPU_LIMIT} ]; then
        SHUTDOWN=0
      fi
    fi

    echo "shutdown ($SHUTDOWN >= $SHUTDOWN_LIMIT)"
  
    if [ ${SHUTDOWN} -ge ${SHUTDOWN_LIMIT} ]; then
      #rm ${FLAG}
      echo shutdown -h 0
    fi
  else
    echo "Block shutdown - file '${FLAG}' not found"
    SHUTDOWN=0
  fi
  sleep ${SLEEP_TIME}
  echo "-----"
done

exit 0
Ultima modifica di zdf_9 il domenica 18 agosto 2013, 17:33, modificato 1 volta in totale.
il nemico più grande si nasconde nell'ultimo posto dove guardi
headlightman
Prode Principiante
Messaggi: 135
Iscrizione: sabato 26 gennaio 2013, 20:04
Desktop: lxde
Distribuzione: Ubuntu 12.04.1 LTS - i686
Sesso: Maschile
Località: Prov. Cuneo

Re: spegnere server inattivo

Messaggio da headlightman »

.... interessa molto anche a me... oltra a ftp e ssh.. c'è il monitoraggio di samba?
cosa voul dire "shutdown effettivo" ?
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: spegnere server inattivo

Messaggio da zdf_9 »

Lo script che ho postato (così com'è scritto) non effettua il shutdown.
Tramite gli "echo" mostra i valori delle variabili interne in modo da poterlo testare nelle varie situazioni che si presentano. E' per questo che viene fatto un "echo" anche al comando "shutdown -h 0".
Un'altra scelta è relativa al comando "rm ${FLAG}". Se si decide di far cancellare il file, lo shutdown avverrà una sola volta.

TODO:
inserire nella parte finale dello script uno "sleep 5m" quando la variabile ${SHUTDOWN} è uguale a 0
per ogni ciclo, usare una sola volta il comando "ps" salvandone l'output in un file

Su samba... bho. Nella mia rete domestica non ho mai avuto la necessità di installare un server windows compatibile.
Lo script usa il comando "ps" per avere una lista dei processi "in esecuzione" e conta quanti contengono una certa stringa.
Fai delle prove cercando "smbd" e "nmbd", controlla quanti processi corrispondono al solo demone, e modifica la variabile DATA in conseguenza.
il nemico più grande si nasconde nell'ultimo posto dove guardi
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

scusatemi per esser sparito dalla discussione, ma le notifiche hanno fallito e ho perso di vista il topic.
ti ringrazio zdf_9 per lo script, ad occhio mi sembra possa andar bene, poi appena ho un attimo di tempo lo provo e ti faccio sapere.
toma.luca95
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 750
Iscrizione: giovedì 25 febbraio 2010, 19:32

Re: spegnere server inattivo

Messaggio da toma.luca95 »

Consiglio di dare un occhiata a monit, serve a monitorare un server e a eseguire comandi in alcuno casi, potrebbe fare quello che ti serve.

Io lo uso per verificare lo stato di apache e MySQL e in caso farli ripartire.
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

finalmente sono riuscito a trovare il tempo per provare lo script sul server :D
funziona alla perfezione e sono riuscito ad adattarlo al meglio alle mie esigenze.

ma (c'è un ma):
ho inserito lo script in rc.local in modo che venga avviato automaticamente all'avvio del server; lo script parte e spegne il server quando dovuto, solo che l'output dello script viene dato a schermo (del server), di conseguenza non ho la possibilità di fare login ed accedere alla riga di comando. da remoto invece, tramite ssh, accedo senza problemi.
nel caso in cui ci dovesse essere un guasto che mi impedisce di entrare con ssh da remoto, come faccio a loggarmi direttamente dal server per riparare il guasto?? c'è un modo per interrompere l'esecuzione dello script? ho provato con ctrl+c, ma non essendo loggato non funziona :(
toma.luca95
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 750
Iscrizione: giovedì 25 febbraio 2010, 19:32

Re: spegnere server inattivo

Messaggio da toma.luca95 »

Il problema nasce perché lo script dovrebbe eseguirsi e fare un fork.
La soluzione banale e brutale è lanciarlo con

Codice: Seleziona tutto

nomescript &
la soluzione più fine è usare screen

Codice: Seleziona tutto

screen -S script -d -m nomescript
A far le cose fatte bene sarebbe bene creare un file in /etc/init.d/ con la dovuta formattazione per agire come un normale demone
ricdata
Prode Principiante
Messaggi: 86
Iscrizione: domenica 22 luglio 2007, 14:14
Distribuzione: Ubuntu 12.04 32bit

Re: spegnere server inattivo

Messaggio da ricdata »

toma.luca95 ha scritto: la soluzione più fine è usare screen

Codice: Seleziona tutto

screen -S script -d -m nomescript
:vittoria: problema risolto!!

grazie a tutti! :ciao:
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: [Risolto] spegnere server inattivo

Messaggio da zdf_9 »

Gli "echo" li ho messi per poter controllare il comportamento dello script ed avere un resoconto a video dei valori che assumono le variabili in modo da adattarlo alle proprie esigenze.
Commenta (anteponendo il carattere "#") o cancella le righe che contengono gli "echo"... non avrai possibili problemi di memoria e/o riempimento dell'HD.

Visto il caldo di questo periodo... :birra: :birra: :birra: :birra:
il nemico più grande si nasconde nell'ultimo posto dove guardi
headlightman
Prode Principiante
Messaggi: 135
Iscrizione: sabato 26 gennaio 2013, 20:04
Desktop: lxde
Distribuzione: Ubuntu 12.04.1 LTS - i686
Sesso: Maschile
Località: Prov. Cuneo

Re: [Risolto] spegnere server inattivo

Messaggio da headlightman »

zdf_9 ha scritto:Gli "echo" li ho messi per poter controllare il comportamento dello script ed avere un resoconto a video dei valori che assumono le variabili in modo da adattarlo alle proprie esigenze.
Visto il caldo di questo periodo... :birra: :birra: :birra: :birra:
ci sto provando anche io, ma ho non mi funziona.... chiedo scusa per la domanda ovvia, ma come faccio a visualizzare le variabili con echo?
mi basta dare il comando (ad esempio) "echo $NUMBER_LIMIT" ?
poi leggendo lo script "cron_user_root_autoshutdown.sh" nelle prime righe è indicato questo file: "tmp/shutdownOK.tmp".. ma non esiste nella cartella.. lo devo creare?

grazie
Avatar utente
zdf_9
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 940
Iscrizione: venerdì 18 giugno 2010, 10:03
Distribuzione: debian x86_64

Re: [Risolto] spegnere server inattivo

Messaggio da zdf_9 »

Gli echo sono già attivi nello script principale. Tieni conto che serve anche lo script cpu_usage.py (io l'ho messo nella directory /aaa-script/ ed è appunto in questa directory che viene cercato).
Quando hai testato lo script principale anteponi il carattere "#" a tutti gli echo e modifica "echo shutdown -h 0" in "shutdown -h 0".
Se vuoi che lo spegnimento avvenga una sola volta, modifica "#rm ${FLAG}" in "rm ${FLAG}"

Il file "/tmp/shutdownOK.tmp" (${FLAG}) è un file che serve per "abilitare" la parte interna dello script (quella dove vi sono i controlli ed il comando di spegnimento). Essendo lo script sempre in esecuzione serve "abilitarlo/disabilitarlo" a proprio piacimento (creando o cancellando il file "/tmp/shutdownOK.tmp")
Nelle prime righe del codice, infatti, c'è "if [ -e ${FLAG} ]; then ", che significa, se esiste il file di nome "/tmp/shutdownOK.tmp", esegui i comandi all'interno.
il nemico più grande si nasconde nell'ultimo posto dove guardi
Scrivi risposta

Ritorna a “Ubuntu su server”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite