GNU/Linux >> Linux Esercitazione >  >> Linux

Gestione di processi Cron duplicati durante l'esecuzione di script

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.

  • Comando Stormo
  • Script PERL singolo.

Utilizza la scheda Feedback per inserire commenti o porre domande. Puoi anche avviare una conversazione con noi.


Linux
  1. Quando è stato creato il file?

  2. Codifica di un file zip?

  3. Quando i file eseguibili non lo sono?

  4. Il mio Cron Job non funziona

  5. PID massimo in Linux

Come impostare un Cron Job in Linux

Come pianificare un lavoro in Cron da eseguire ogni ora in Ubuntu 20.04

Come impostare un Cron Job con caratteri speciali su Hostinger?

Linux Crontab:15 fantastici esempi di Cron Job

Riciclaggio PID di Linux

Come visualizzare un cron job attualmente in esecuzione?