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í.
Související články
- 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.