Martedì, 02 Giugno 2015 23:51

Script per avviare servizi finchè serve

Rate this item
(0 votes)

E' parecchio che non scrivo sul blog, ma ho fatto molte cose nel frattempo per il sito per il quale ho aperto questo sito....ora lo posso svelare è www.decores-cs.com, il sito dell'attività di mia moglie che nel frattempo ha aperto la sua impresa.
Ma torniamo all'argomento del titolo. Capita di trovare delle applicazioni basate su web, tipo l'ottimo programma di fatturazione Gnujiko, che possono girare sia su server remoto che in locale su una macchina LAMP. Solo che far girare in continuazione un server Apache+mysql su un pc con Linux, lo rallenta abbastanza. Se lo si usano solo per l'applicazione web-based sarebbe molto meglio farli partire prima di lanciare il programma e poi  chiuderli all'uscita.

Linux ha la possibilità di creare dei mini-programmi (script) che possono fare molte cose....allora perché non creare uno script della shell apposta? Ecco come ho fatto.

ATTENZIONE: post modificato il 5/6/15!

Dopo aver installato Gnujiko (per cui scriverò forse una guidina apposta) va da sè che per usarlo si deve usare un browser. Userò Firefox.

Da linea di comando basta lanciare

~ $ firefox sito

per aprire una finestra del browser che punta al sito indicato (nel mio caso è un sito in locale chiamato fatture.local

Quindi si apre un editor di testo creando il file fatture.sh (ma il nome può essere quello che si vuole) e si inizia a scrivere

#!/bin/sh

#avviamo i servizi apache e sql
sudo service apache2 start
sudo service mysql start

#lanciamo firefox sul sito e riceviamo il numero di pid del processo appena lanciato e lo si invia a /dev/null per memorizzarlo temporaneamente dopo una attesa di 10 secondi, utile per completare l'avvio del programma.
firefox fatture.local &
pid=$!
sleep 10
ps -p$pid 2>&1 > /dev/null
#quindi si acquisisce lo status del processo avente il pid rilevato
status=$?

#se il valore dello status è 0, il programma è in esecuzione.
if [ "$status" = "0" ]
#in tal caso facciamo in modo che ogni tanto lo script vada a controllare lo status per vedere se il processo firefox è ancora attivo o è stato chiuso
then
while [ "$status" = "0" ]
do
sleep 60
ps -p$pid 2>&1 > /dev/null
status=$?
done
#nel caso invece il valore status controllato all'inizio,o quello rilevato ogni 60 secondi non sia 0, vuol dire che il processo NON è in esecuzione, quindi lo scrive a video (se stiamo eseguendo lo script dalla shell e termina il ciclo IF
else
echo Process with pid $pid is not running fi
#a questo punto si possono fermare i due servizi
sudo service apache2 stop
sudo service mysql stop

Si salva e si chiude.

A questo punto basta creare una iona sul desktop che faccia eseguire lo script. Si clicca col destro su un punto del desktop e si seleziona "nuovo lanciatore". Nella finestra che appare si da un nome, e si può scrivere la linea di comando:

gksudo -k -u root 'sh fatture.sh'

dove gksudo serve ad aprire l'interfaccia grafica che richiede la password di super user, necessaria per le autorizzazioni a far partire e fermare i servizi.

FATTO!

anzi...no occorre rimuovere i due servizi dall'avvio automatico del sistema.

Per Apache da terminale

- $ sudo update-rc.d -f apache2 remove

Per Mysql occorre modificare un file gksudo gedit /etc/init/mysql.conf andando a commentare anteponendo un cancelletto # davanti alle righe relative a "start on". tipo queste:

start on (net-device-up
and local-filesystems
and runlevel [2345])

Salvare e chiudere....

FATTO (davvero)

al prossimo avvio i due servizi non saranno attivi con un bel risparmio di risorse, il pc andrà più veloce e quando servirà di aviare il programma basterà farlo dall'icona sul desktop.

 

ATENZIONE! modifica del 5/6/15

Lo script così presentato funziona benissimo...ha solo un piccolo problema: la finestra di firefox si apre come root, quindi ogni cosa fatta avrà modifica con permessi di root, per cui nello specifico, le fatture create e salvate come pdf saranno nella dir di root, con permessi esclusivi.

Per ovviare a questa cosa ho apportato delle modifiche allo script. Eccole nel dettaglio:

1) il processo firefox viene lanciato come utente con il comando:

sudo --user=utente firefox -new-window fatture.ecco &

che esegue il programma come utente e in una nuova finestra (nel caso firefox fosse già aperto).

2) Questo crea un paio di problemi, come ad esempio la rilevazione del pid. Il processo infatti viene lanciato con un pid, ma subito decade in un altro. Dunque il metodo di rilevamento che avevamo definito sopra non funziona più. A questo punto per avere il pid del processo che mi interessa faccio una ricerca per nome:

pid=$(ps -ae | awk '$NF~"firefox" {print $1}')

istruzione che esegue una ricerca in tutti i processi in esecuzione che contengano la parola firefox....ne dovrebbe trovare uno solo.... a quel punto si prende con il comando awk la prima colonna che è il numero di pid. Il comando totale, racchiuso tra parentesi, manda l'output nella variabile pid.

3) Non so per quale motivo, ma questa cosa mi ha danneggiato l'avvio e la chiusura di mysql....cercando cercando ho trovato che queste due righe risolvono la questione

sudo /etc/init.d/mysql stop
sudo service mysql stop

Bene! a questo punto ho salvato lo script con nuovo nome, originalmente fatture2.sh, e modificato il lanciatore dal desktop in modo che puntasse al nuovo script.

Ecco fatto! Rispetto allo script precedente è da segnalare che in questo caso i server verranno spenti alla chiusura DEFINITIVA di firefox, incluse le eventuali finestre di navigazione...ma ci si può stare, almeno finché non capirò come fare per identificare le singole tab di firefox ;)

ANZI visto che con Firefox ho parecchi problemi anche a livello di gestione memoria ho visto che usando invece chromium funziona tutto alla grande!

Inserisco qui di seguito lo script definitivo, pronto al copia-incolla

#!/bin/sh
sudo service apache2 start
sudo service mysql start
#start firefox as user
sudo --user=utente firefox -new-window fatture.ecco &
#find pid of process by name
pid=$(ps -ae | awk '$NF~"firefox" {print $1}')
echo pid $pid
#Redirect stdout and stderr of the ps command to /dev/null
ps -p$pid 2>&1 > /dev/null
#Grab the status of the ps command
status=$?
#A value of 0 means that it was found running
if [ "$status" = "0" ]
then
  while [ "$status" = "0" ]
  do
  sleep 60
  ps -p$pid 2>&1 > /dev/null
status=$?
  done
#A value of non-0 means that it was NOT found running
else
echo Process with pid $pid is not running
fi
#stopping processes
sudo service apache2 stop
sudo /etc/init.d/mysql stop
sudo service mysql stop

 

 

Read 3877 times Last modified on Lunedì, 20 Marzo 2017 10:21

Leave a comment

Make sure you enter all the required information, indicated by an asterisk (*). HTML code is not allowed.

Annuncio pubblicitario by google

Questo sito utilizza cookies per amministrare autenticazioni, navigazione, statistiche di accesso e/o altre funzioni. Continuando la navigazione nel sito acconsentite che questi tipi di cookie vengano memorizzati nel vostro dispositivo.

Visualizzare la Politica sui Cookies

Visualizzare il Documento della Direttiva sulla e-Privacy

Avete Rifiutato i cookies. Questa decisione puo'essere modificata.

Avete acconsentito all'uso dei cookies. Questa decisione puo' essere modificata.