GNU/Linux >> Znalost Linux >  >> Linux

Použití skriptu Cron Wrapper

Tento tutoriál je určen ke dvěma věcem:k rozšíření článku Cron Troubleshooting; a poskytnout přehled jednoduchého konceptu skriptování, který používá vytvoření souboru jako příznak k označení, že něco běží. To je užitečné především tehdy, když potřebujete něco spouštět nepřetržitě, ale ne více než jednu kopii najednou. Můžete vytvořit soubor jako příznak, abyste zkontrolovali, zda je úloha již spuštěna, a před provedením další akce tento příznak zkontrolujte.

Přímá aplikace je, když máte úlohu cron, která se spouští každou minutu nebo každých několik minut. S rychle se opakujícím cronem, pokud předchozí úloha trvá déle, než je naplánovaný čas, mohou se tyto úlohy nahromadit a způsobit zatížení serveru nebo zhoršit další problémy. Aby se tomu zabránilo, lze v crontab (místo zamýšlené úlohy cronu) nastavit jednoduchý skript. Když je cron spuštěn, spustí skutečnou úlohu pouze v případě, že již není spuštěn konkurenční proces.

Proč používat Cron Wrapper?

Cron wrapper se používá, když máte úlohu cron, která potřebuje běžet zády k sobě, ale musí na sebe nešlápnout. To je dobré pro úlohy, které chcete nastavit tak, aby se spouštěly nepřetržitě. Úlohy, které by se měly spouštět kdekoli mezi každou minutou a každých pět minut, by měly využívat podobný obal.

Pokud nepoužijete wrapper u úlohy cron, která se spouští příliš často, můžete spustit několik úloh současně, když se pokusíte udělat totéž. Tyto konkurenční úkoly zpomalují celé práce. Tyto „hromadné úlohy cron“ se mohou dokonce tak vymknout z rukou, že přetíží server a způsobí, že server přestane normálně reagovat.

Co je to Cron Wrapper?

Důvod, proč se tomu říká cron wrapper, je ten, že je to skript, který obtéká úlohu cron a kontroluje, zda již není spuštěna jiná instance cronu. Pokud je spuštěna další kopie, wrapper způsobí, že cron tento běh vynechá a počká do dalšího běhu, aby to znovu zkontroloval. Existuje několik způsobů, jak cronové obaly zajistit žádné překrývání.

Metoda kontroly procesu

Jedním ze způsobů je zkontrolovat všechny běžící procesy pro uživatele a dvakrát zkontrolovat, zda již neexistuje jiný proces se stejným názvem nebo atributy jako ten, který chcete spustit. Takto funguje soubor cron.sh od Magenta, který zkontroluje další instanci cron.php spuštěnou jako uživatel, a pokud nějaká běží, ukončí se. Spolehlivě to může být složité, a proto to není něco, co bychom doporučovali pro začínající uživatele.

Metoda Lockfile

Přímočarou metodou je použití toho, co se nazývá lockfile. Cron wrapper zkontroluje, zda lockfile (jakýkoli soubor se specifickým názvem/umístěním) na začátku běhu existuje. Pokud lockfile chybí, skript tento soubor vytvoří a pokračuje. Vytvoření souboru zámku signalizuje začátek úlohy cron. Když úloha cron dokončí skript wrapper, odstraní soubor zámku.

Dokud soubor zámku existuje, nový modul wrapper nespustí zbytek úlohy cron, zatímco bude spuštěna jiná. Jakmile se první spuštění dokončí a zámek je odstraněn, další obal bude moci znovu vytvořit nový soubor zámku a zpracovat jej normálně.

Příklad skriptu Wrapper

Pro začátek chceme vytvořit jednoduchý bash skript. V souboru uvádíme skript, který má být interpretován programem /bin/bash

#!/bin/bash

Poté chceme definovat název a umístění lockfile, který budeme používat jako náš příznak.

# Set lockfile name and location
lockfile="~/tmp/cronwrapper.lock"

Dále musí skript zkontrolovat, zda tento soubor zámku existuje. Pokud existuje, pak již běží další kopie skriptu a měli bychom skript ukončit.

# Check if the lockfile exists
if [[ -f $lockfile ]]; then
# If the lockfile exists quit
exit;

Jinak, pokud soubor zámku neexistuje, měli bychom vytvořit nový soubor zámku, což znamená, že pokračujeme se zbytkem skriptu. Vytvoření souboru zámku také říká, že všechny budoucí kopie, které by mohly být spuštěny, mají odložit, dokud nebude soubor zámku odstraněn. Chceme také zahrnout skutečnou úlohu, která má být spuštěna, ať už je to volání adresy URL přes web, spuštění souboru PHP na příkazovém řádku nebo cokoli jiného.

# If the lockfile is missing continue
else
# Create the lockfile
touch $lockfile
# Insert cron task here/code>

Jakmile je zamýšlená úloha spuštěna a dokončena, chceme vyčistit náš lockfile, aby další spuštění úlohy cron vědělo, že poslední spuštění bylo dokončeno a vše je připraveno k opětovnému spuštění.

# Cleanup the lockfile
rm -f $lockfile
fi

Ve výše uvedeném příkladu je vhodné definovat soubor zámku jako proměnnou ($lockfile), aby na něj bylo možné později snadno odkazovat. Také pokud chcete změnit umístění, musíte jej změnit pouze na jednom místě ve skriptu.

Tento příklad také používá „~“ v cestě k souboru zámku jako zástupce. To říká shellu, aby převzal domovský adresář uživatele. Úplná cesta by tedy vypadala asi takto:/home/username/tmp/cron.lock.

Pomocí „~“ však můžete použít kopie stejného skriptu pro mnoho uživatelů na stejném serveru a nemusíte upravovat úplnou cestu pro každého uživatele. Shell automaticky použije domovský adresář pro každého uživatele, když je spuštěn obalový skript.

Dát to všechno dohromady (cronwrapper.sh)

Následující text můžete zkopírovat a vložit do svého textového editoru na vašem serveru. Můžete si to pojmenovat, jak chcete, ale tady jsou všechny části dohromady.

#!/bin/bash
lockfile="~/tmp/cronwrapper.lock"
if [[ -f $lockfile ]]; then
exit;
else
touch $lockfile
# Insert cron task here
rm -f $lockfile
fi

Toto je velmi jednoduchý příklad a mohl by být rozšířen mnohem dále. V ideálním případě můžete přidat zaškrtnutí, abyste ignorovali soubor zámku starší než hodinu a přesto spustili novou instanci úlohy cron. To by znamenalo přerušenou úlohu, která se po sobě nedokázala uklidit. Dalším rozšířením může být potvrzení, že předchozí úloha byla dokončena čistě. Nebo ještě jiný návrh, který by zkontroloval chyby ze spuštěné úlohy cron a na základě těchto chyb by rozhodoval nebo posílal výstrahy. Svět je vaše ústřice, pokud jde o obaly cronu! Podívejte se na naše VPS servery Liquid Webu, aby úkoly, jako jsou tyto, běžely hladce.


Linux
  1. Použití at pro jednorázové úlohy cron v Linuxu

  2. Používáte Notify-Send s Cronem?

  3. Crontab Log:Jak protokolovat výstup mého skriptu Cron

  1. Odesílání HTML pošty pomocí shell skriptu

  2. automatizace relace telnet pomocí bash skriptů

  3. Používáte úlohy CRON k návštěvě adresy URL?

  1. Odstraňte soubory protokolu pomocí úlohy cron

  2. Získejte MAC adresu pomocí shell skriptu

  3. Přeneste soubory pomocí lftp v bash skriptu