Se durante un determinato periodo di tempo hai osservato uno schema specifico sul tuo dispositivo Linux che ha attivato un allarme per un elevato utilizzo di CPU/memoria, si consiglia di analizzare l'insieme di processi in esecuzione al momento dell'allarme.
Durante l'analisi potresti scoprire che un processo o uno script specifico sta eseguendo più istanze contemporaneamente a causa di una chiamata duplicata su un processo pianificato (che è stato impostato utilizzando i lavori cron).
Per evitare che ciò accada, puoi utilizzare due alternative:
Impostazione di un file di blocco
All'interno dello script, implementa una procedura che verifica se esiste un file. In caso contrario, lo script lo creerà e continuerà a essere eseguito come previsto. Se il file non è richiesto una volta completato lo script, puoi eliminarlo per assicurarti che la prossima esecuzione del lavoro non lo consideri "in uso".
Impostazione di un file PID in BASH
Simile al metodo sopra menzionato, l'utilizzo di un file Process ID (PID) si basa sulla lettura di un file, con la differenza che all'interno di questo file viene inserito il PID dell'istanza in esecuzione, ciò consentirà di convalidare che il processo se il processo è in esecuzione, mentre il file di blocco verifica solo che lo script sia stato avviato, ignorando se è ancora in esecuzione o se è stato sospeso/terminato prima della rimozione del file.
Passaggi per configurarlo:
Attraverso il frammento di codice seguente, puoi vedere un esempio del codice che implementeresti all'interno del tuo script. Il testo che inizia con un cancelletto (#) è un commento all'interno del codice, quindi può essere rimosso nell'implementazione finale.
NOTA: Tieni presente che devi prima verificare se lo script soddisfa le tue esigenze. Non dare per scontato che possa funzionare al primo tentativo. Potrebbero essere necessarie modifiche.
# A. Define your PID file using the full path where it'll be located.
# Do not place your code within any /tmp folder as these get cleaned up automatically and might interfere with the expected behaviour of the script.
# B. Check if the PID file exists, if it does, it will run the intended function.
PIDFILE = /var/apps/testscript.pid
# 1. Read the content of our PID file (with cat), and assign it to the PID variable
if [ -f $PIDFILE ] then
# 2. Verify if the content of the file is a running process
PID = $(cat $PIDFILE)
# In here, the '%?' variable obtains the exit code from our previous command
ps -p $PID > /dev/null 2>&1
# 3. If the content of the file is a process (an output equal to 0 means succesful), output a message, and exit the application.
if [ $? -eq 0 ] then
echo "Job is already running"
exit 1
else
# 4. If the exit code was not succesful, we assume the process was not running, so we place the current process ID into the PID File
echo $$ > $PIDFILE
if [ $? -ne 0 ] then
echo "Could not create PID file"
exit 1
fi
fi
# C. If the PID file does not exist, it will attempt to create it, then run the code
else
# 1. This outputs the current PID into the PID file:
# The '$$' value is a variable for the current PID.
# The '>' operand directs the output from echo to a file
echo $$ > $PIDFILE
# 2. If the exit code was not succesful, output an error message, and exit the application.
if [ $? -ne 0 ]
then
echo "Could not create PID file"
exit 1
fi
fi
# *** In here you need to insert the original script code *** #
# D. Remove the PID file so we try to always have a "clean slate"
rm $PIDFILE
Altre soluzioni
Oltre alle due alternative precedenti, ci sono diverse utilità che puoi implementare.
Flock
Il comando flock è un'utilità installata sulle distribuzioni Linux più recenti che gestisce i blocchi dagli script della shell
Puoi fare riferimento alla documentazione ufficiale al seguente URL per saperne di più sul suo utilizzo:
- https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html
La cosa utile di flock è che il blocco del file verrà mantenuto in posizione fino al completamento del processo originale, a quel punto lo stormo rilascerà il blocco del file. Questo è vero sia che il processo venga completato correttamente o meno.
Solo
Solo è uno script Perl che lega l'esecuzione dello script a una porta di rete anziché a un file,
Puoi fare riferimento al sito ufficiale per avere maggiori informazioni:
- https://www.timkay.com/solo/.
Simile ad altre implementazioni, questo creerà un blocco che verrà rilasciato solo dopo il completamento dello script assegnato:
$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use
Il vantaggio di vincolare una porta invece di un file è che una porta non può essere eliminata. Che con altre implementazioni "rilascerebbe" il blocco esistente, consentendo istanze duplicate di un lavoro.
Note aggiuntive
Sebbene le utilità e le pratiche di cui sopra impediscano l'esecuzione di lavori duplicati, è importante monitorare il modo in cui interagiscono i tuoi cronjob per evitare lavori sovrapposti o un uso eccessivo delle risorse che potrebbero ostacolare le prestazioni del nostro dispositivo e le nostre operazioni.
Articoli correlati
- Comando Stormo
- Script PERL singolo.
Utilizza la scheda Feedback per inserire commenti o porre domande. Puoi anche avviare una conversazione con noi.