GNU/Linux >> Znalost Linux >  >> Linux

Správa duplicitní úlohy Cron při spouštění skriptů

Pokud jste během určité doby zaznamenali na svém linuxovém zařízení určitý vzorec, který spustil alarm pro vysoké využití CPU/paměti, doporučujeme analyzovat sadu procesů, které byly v době alarmu spuštěny.

Během analýzy můžete zjistit, že určitý proces nebo skript spouští více instancí současně kvůli duplicitnímu volání naplánovaného procesu (který byl nastaven pomocí úloh cron).

Abyste tomu zabránili, můžete použít dvě alternativy:

Nastavení souboru zámku

V rámci skriptu implementujte proceduru, která ověří, zda soubor existuje. Pokud tomu tak není, skript jej vytvoří a bude pokračovat v provádění podle očekávání. Pokud soubor po dokončení skriptu není vyžadován, můžete jej smazat, abyste zajistili, že při příštím spuštění úlohy nebude považován za „použitý“.

Nastavení souboru PID v BASH

Podobně jako u výše uvedené metody se použití souboru Process ID (PID) spoléhá na čtení souboru, s tím rozdílem, že do tohoto souboru je umístěn PID běžící instance, což umožní ověřit, že proces, pokud proces je spuštěn, zatímco soubor zámku pouze ověřuje, že se skript spustil, bez ohledu na to, zda je stále spuštěn nebo zda byl pozastaven/ukončen předtím, než byl soubor odstraněn.

Postup nastavení:

Prostřednictvím níže uvedeného úryvku kódu můžete vidět ukázku kódu, který byste implementovali do svého skriptu. Text, který začíná symbolem libry (#), je komentářem v kódu, takže jej lze při konečné implementaci odstranit.

POZNÁMKA: Uvědomte si, že nejprve musíte vyzkoušet, zda skript vyhovuje vašim potřebám. Nepředpokládejte, že to může fungovat na první pokus. Mohou být nutné úpravy.

# 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

Další řešení

Kromě dvou výše uvedených alternativ existují různé nástroje, které můžete implementovat.

Hejno

Příkaz flock je nástroj nainstalovaný v novějších distribucích Linuxu, který spravuje zámky ze skriptů prostředí

Další informace o jeho použití naleznete v oficiální dokumentaci na níže uvedené adrese URL:

  • https://manpages.ubuntu.com/manpages/xenial/man1/flock.1.html

Užitečná věc na flock je, že zámek souboru zůstane na místě, dokud se nedokončí původní proces, v tom okamžiku flock uvolní zámek souboru. To platí bez ohledu na to, zda je proces dokončen úspěšně nebo neúspěšně.

Sólo

Solo je skript v Perlu, který váže provádění skriptu k síťovému portu místo souboru,

Další informace naleznete na oficiálních stránkách:

  • https://www.timkay.com/solo/.

Podobně jako u jiných implementací to vytvoří zámek, který se uvolní až po dokončení přiřazeného skriptu:

$ ./solo -port=1234 /var/tmp/script.sh & 1234
$ ./solo -port=1234 /var/tmp/script.sh
solo(1234): Address already in use

Výhodou vazby portu místo souboru je, že port nelze odstranit. Což s jinými implementacemi „uvolní“ stávající zámek a umožní duplicitní instance úlohy.

Další poznámky

Přestože výše uvedené nástroje a postupy zabraňují spouštění duplicitních úloh, je důležité sledovat způsob interakce vašich cronjobů, abyste se vyhnuli překrývání úloh nebo nadměrnému využívání zdrojů, které by mohly bránit výkonu našeho zařízení a operací.

  • Příkaz Hejna
  • Skript Solo PERL.

Pomocí karty Zpětná vazba můžete přidat komentáře nebo položit otázky. Můžete s námi také zahájit konverzaci.


Linux
  1. Jak nastavit úlohu Cron v TrueNAS

  2. Kdy byl soubor vytvořen?

  3. Když spustitelné soubory nejsou?

  1. Problém Crontab:Cron Job nefunguje při použití procent

  2. Žádná taková chyba souboru nebo adresáře při spouštění binárního souboru

  3. Maximální PID v Linuxu

  1. Přenositelnost odkazů na deskriptor souboru?

  2. Kódování souboru ZIP?

  3. Jak zobrazit aktuálně spuštěnou úlohu cronu?