Virtlab:Komponenty/CRON
Z VirtlabWiki
< Virtlab:Komponenty(Rozdíly mezi verzemi)
Verze z 12:02, 6. 11. 2007 Dol72 (Diskuse | příspěvky) (→Troubleshooting - rozvedení používání démona at) ← Předchozí porovnání |
Aktuální verze Gry72 (Diskuse | příspěvky) (→Detailní informace pro vývojáře) |
||
Řádka 1: | Řádka 1: | ||
- | [[Virtlab:Aktivační server|Aktivační server]] (AS) byl nahrazen činností daemona [http://www.linuxmanpages.com/man8/atd.8.php atd], který je standardní součástí BSD/Linuxu. Tento daemon zajišťuje jednorázové spuštění úloh v zadanou dobu. Protože s názvem '''atd''' se v češtině špatně pracuje (vypadá to jako atakdále, nedá se to dobře skloňovat), bude dále ''z čistě jazykových důvodů'' referován jako '''cron''' (účelem podobný démon i když s jinou filosofií). | + | Komponenta CRON realizuje v každé lokalitě aktivaci úloh vyžádaných uživateli dané lokality. Je realizována pomocí démona atd. Rezervační server každé lokality prostřednictvím atd naplánuje spuštění aktivačního a deaktivačního skriptu na začátku, resp. konci příslušného timeslotu. |
- | Jediný, kdo s AS komunikoval, byl [[Virtlab:Rezervační server|Rezervační server]] (RS), proto po odstranění AS se vše odehrává v RS. | + | |
- | Jsou prováděny pouze následující dvě operace: | + | Na začátku timeslotu se dějí tyto akce: |
+ | * Vygenerování konfigurace pro spojovací prvky Distribuovaného virtuálního spojovacího pole pro spojení distribuované virtuální topologie | ||
+ | * Upload těchto konfigurací prostřednictvím Konfiguračních serverů příslušných lokalit | ||
+ | * Smazání konfigurací v úloze použitých laboratorních prvků (komunikace s Mazacími servery dotčených lokalit) | ||
- | === Zařazení rezervace do cron fronty === | + | Na konci timeslotu se dějí tyto akce: |
- | Soubor činností, které mají být vykonány v souvislosti s rezervací, je zapsán v externím programu (typicky [[Activator-script]]). Do fronty jsou zařazeny voláním funkce '''enqueue_cron''', která je v současné době definována i použita ve zdrojovém textu '''virtlab/DISTR/src/rsv-server/src/commit_table.c'''. Její deklarace: | + | * Vygenerování konfigurace pro spojovací prvky Distribuovaného virtuálního spojovacího pole pro rozpojení distribuované virtuální topologie |
+ | * Upload těchto konfigurací prostřednictvím Konfiguračních serverů příslušných lokalit | ||
- | enqueue_cron(char *xid, char *resid, struct datetime from, char *format, ...) | + | == Detailní informace pro vývojáře == |
- | ;xid : označení transakce, je předáváno pouze pro potřeby ladicích výpisů | + | * [[Virtlab:CRON]] |
- | ;resid : řetězec označující rezervaci. Může být následně využit při odstranění rezervace z cron fronty. Doporučuje se do něj vkládat resid. | + | |
- | ;from : čas, kdy má být úloha spuštěna. Jde o strukturu popsanou v "datetime.h" sestávající s <tt>int</tt> hodnot year, month, day, hour, min | + | |
- | ;format : příkaz, který má být spuštěn formátovaný pro vsprintf. | + | |
- | ;... : argumenty příkazu | + | |
- | + | ||
- | Funkce je volána uvnitř '''drop_first_commit_into_db''', což je místo, kde se úspěšná rezervace zaznamenává do databáze. | + | |
- | + | ||
- | Příklad 1: | + | |
- | from.year=2007; from.month=11; from.day=4; from.hour=12; from.min=3; | + | |
- | enqueue_cron("ostrava.128.1194212742", "46@ostrava", from, "/opt/virtlab/activate.sh %s", tptr->resid.id); | + | |
- | enqueue_cron("ostrava.128.1194212742", "46@ostrava", from, "/opt/virtlab/deactivate.sh %s", tptr->resid.id); | + | |
- | + | ||
- | === Odstranění rezervace z cron fronty === | + | |
- | Pokud byla rezervace zrušena, projeví se to ve funkci '''remove_reservation_from_db''', která je ve zdrojovém textu '''virtlab/DISTR/src/rsv-server/src/dbutils.c''' a ve které se proto volá nová funkce '''unqueue_cron(char *xid, char *cronresid)'''. | + | |
- | ;xid : označení transakce, je předáváno pouze pro potřeby ladicích výpisů | + | |
- | ;cronresid : řetězec označující rezervaci, viz parametr '''resid''' funkce enqueue_cron. | + | |
- | + | ||
- | Příklad 2: | + | |
- | unqueue_cron("ostrava.128.1194212749", "46@ostrava"); | + | |
- | + | ||
- | * Zdůrazněme, že funkce odstraní ''všechny'' úlohy, které byly cronu zadány s použitím cronresid (jako například v Příkladu 1). | + | |
- | * Odstranění úlohy je náročná operace, která by neměla probíhat příliš často, neboť je interně realizována vyhledáváním cronresid grepováním mnoha malých souborů. | + | |
- | + | ||
- | === Troubleshooting === | + | |
- | Kromě faktu, že obě funkce *queue_cron jsou velmi VLLOG výřečné, lze kontrolovat stav fronty pomocí příkazů '''at'''. | + | |
- | + | ||
- | ==== Stručný popis at a jeho ovládání ==== | + | |
- | ;atd : démon - na něj se nesahá, pouze teoreticky je třeba dbát, aby startoval s operačním systémem, v praxi bezproblémové. | + | |
- | ;echo ''příkazy'' | at ''čas datum'' : zařazení úlohy. Všimněte si pořadí ''čas datum'' - je opačné, než jak se vypisuje čas v MySQL a zbytku Virtlabu. Po zařazení úlohy je jí přiděleno číslo jobu interní pro at démona (dále ''at_číslo_jobu''), které nelze ovlivnit a s ničím jiným nesouvisí. | + | |
- | ;atq : vypíše at_čísla_jobů, časy jejich spuštění a jejich majitele. Nevypíše příkazy jobu. | + | |
- | ;at -c ''at_číslo_jobu'' : vypsání příkazů, které se spouštějí v daném jobu. | + | |
- | ;atrm ''at_číslo_jobu'' : odstraní job z fronty at démona. | + | |
- | K jobům může root přistupovat i přímo prohlídkou souborů v '''/var/spool/cron/atjobs''', kde jsou joby uloženy v souborech pojmenovaných např.: | + | |
- | -rwx------ 1 dol72 daemon 559 Nov 6 11:50 a00025012fbd6c | + | |
- | kde '''a''' je aktivní úloha s normální prioritou (jiná písmena snižují prioritu, viz manuál nebo příkaz '''batch'''), 00025 značí job č. 25<sub>HEX</sub> = 37<sub>DEC</sub>, 012fbd6c<sub>HEX</sub> = 19905900<sub>DEC</sub> = unix_timestamp začátku/60 (tj. v minutách, přesněji spouštět nelze) (zde např. pro Tue Nov 6 13:00:00 2007). Majitel úlohy je znám jako vlastník souboru. | + | |
- | + | ||
- | + | ||
- | ==== Vyhledání všech úkolů se známým RESID ==== | + | |
- | Jak již výše uvedeno, nelze korelovat číslo jobu '''at''' a RESID. Queue funkce jsou napsány tak, že RESID je vkládáno jako poznámka za příkaz, který má být spuštěn. Následující skript projde všechny joby, vyhledá v nich RESID (v tomto případě například ''46@ostrava'') a vypíše obsahy příslušných jobů. | + | |
- | atq | cut -f1 | while read A ; do if at -c $A | grep -q RES-46@ostrava- ; then at -c $A ; fi ; done | + | |
- | + | ||
- | === Nutná opatření při implementaci aktivačních/deaktivačních skriptů === | + | |
- | + | ||
- | * testovat, zda aktivační/deaktivační skript skončil v rozumném čase | + | |
- | * testovat výsledek skriptu | + | |
[[Kategorie:Komponenty virtlabu]] | [[Kategorie:Komponenty virtlabu]] | ||
[[Kategorie:Server]] | [[Kategorie:Server]] | ||
- | [[Kategorie:Rezervační server]] | + | [[Kategorie:CRON]] |
- | [[Kategorie:Aktivační server]] | + |
Aktuální verze
Komponenta CRON realizuje v každé lokalitě aktivaci úloh vyžádaných uživateli dané lokality. Je realizována pomocí démona atd. Rezervační server každé lokality prostřednictvím atd naplánuje spuštění aktivačního a deaktivačního skriptu na začátku, resp. konci příslušného timeslotu.
Na začátku timeslotu se dějí tyto akce:
- Vygenerování konfigurace pro spojovací prvky Distribuovaného virtuálního spojovacího pole pro spojení distribuované virtuální topologie
- Upload těchto konfigurací prostřednictvím Konfiguračních serverů příslušných lokalit
- Smazání konfigurací v úloze použitých laboratorních prvků (komunikace s Mazacími servery dotčených lokalit)
Na konci timeslotu se dějí tyto akce:
- Vygenerování konfigurace pro spojovací prvky Distribuovaného virtuálního spojovacího pole pro rozpojení distribuované virtuální topologie
- Upload těchto konfigurací prostřednictvím Konfiguračních serverů příslušných lokalit
[editovat]