Virtlab:CRON
Z VirtlabWiki
Verze z 11:55, 29. 11. 2007 Gry72 (Diskuse | příspěvky) (→Zařazení rezervace do cron fronty) ← Předchozí porovnání |
Aktuální verze Dol72 (Diskuse | příspěvky) (→Stručný popis at a jeho ovládání - Jasný příklad syntaxe at u příležitosti přechodu na zimní čas) |
||
Řádka 10: | Řádka 10: | ||
;xid : označení transakce, je předáváno pouze pro potřeby ladicích výpisů | ;xid : označení transakce, je předáváno pouze pro potřeby ladicích výpisů | ||
;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. | ;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 job spuštěn. Jde o strukturu popsanou v "datetime.h" sestávající s <tt>int</tt> hodnot year, month, day, hour, min | + | ;from : čas, kdy má být job spuštěn. Jde o strukturu popsanou v "datetime.h" sestávající z <tt>int</tt> hodnot year, month, day, hour, min |
;format : příkaz, který má být spuštěn formátovaný pro vsprintf. | ;format : příkaz, který má být spuštěn formátovaný pro vsprintf. | ||
;... : argumenty příkazu | ;... : argumenty příkazu | ||
Řádka 18: | Řádka 18: | ||
Příklad 1: | Příklad 1: | ||
from.year=2007; from.month=11; from.day=4; from.hour=12; from.min=3; | 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/crossconnect/activator.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 === | === Odstranění rezervace z cron fronty === | ||
Řádka 25: | Řádka 24: | ||
;xid : označení transakce, je předáváno pouze pro potřeby ladicích výpisů | ;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. | ;cronresid : řetězec označující rezervaci, viz parametr '''resid''' funkce enqueue_cron. | ||
- | + | ;návratová hodnota : 0 - OK, 1 - operace se nezdařila | |
Příklad 2: | Příklad 2: | ||
unqueue_cron("ostrava.128.1194212749", "46@ostrava"); | unqueue_cron("ostrava.128.1194212749", "46@ostrava"); | ||
Řádka 40: | Řádka 39: | ||
;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é. | ;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'' | [http://www.linuxmanpages.com/man1/at.1.php at] ''čas datum'' : zařazení jobu. 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í. | ;echo ''příkazy'' | [http://www.linuxmanpages.com/man1/at.1.php at] ''čas datum'' : zařazení jobu. 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í. | ||
+ | : Příklad <code>echo "/opt/virtlab/crossconnect/activator.sh 671@ostrava 2008-10-26 20:00:00 >/dev/null 2>&1 # RES-671@ostrava-" | at 16:58 2008-10-26</code> | ||
;atq : vypíše at_čísla_jobů, časy jejich spuštění a jejich majitele. Nevypíše příkazy jobu. | ;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. | ;at -c ''at_číslo_jobu'' : vypsání příkazů, které se spouštějí v daném jobu. | ||
Řádka 54: | Řádka 54: | ||
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ů. | 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 | atq | cut -f1 | while read A ; do if at -c $A | grep -q RES-46@ostrava- ; then at -c $A ; fi ; done | ||
+ | |||
+ | Ve webu každého serveru je k dispozici <code>/cronmon.php</code>, který umí vypsat všechny joby rovnou úhledně přes prohlížeč do tabulky. | ||
=== Nutná opatření při implementaci aktivačních/deaktivačních skriptů === | === Nutná opatření při implementaci aktivačních/deaktivačních skriptů === | ||
Řádka 65: | Řádka 67: | ||
Příslušné pipes potlačí jakýkoliv výstup. [http://ftp.de.debian.org/debian/pool/main/a/at/at_3.1.10.tar.gz Původní zdrojový text atd] neumožňuje s výstupy naložit jinak (například posílat data místo poštou do syslogu), takže řešením by byla pouze jeho úprava. Nicméně pokud se nerozbíhají úlohy, mohlo by odesílání e-mailů mít i svůj půvab... | Příslušné pipes potlačí jakýkoliv výstup. [http://ftp.de.debian.org/debian/pool/main/a/at/at_3.1.10.tar.gz Původní zdrojový text atd] neumožňuje s výstupy naložit jinak (například posílat data místo poštou do syslogu), takže řešením by byla pouze jeho úprava. Nicméně pokud se nerozbíhají úlohy, mohlo by odesílání e-mailů mít i svůj půvab... | ||
+ | |||
+ | Ve zdrojových textech '''commit_table.c''' a '''dbutils.c''' (viz níže) je cesta <tt>/opt/virtlab/de|activate.sh</tt> sprostě natvrdo zadána bez skrupulí a konstant! | ||
Aktuální verze
Aktivační server (AS) byl nahrazen činností daemona atd, který je standardní součástí BSD/Linuxu. Tento daemon zajišťuje jednorázové spuštění jobů 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í). Jediný, kdo s AS komunikoval, byl 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:
Obsah |
Zařazení rezervace do cron fronty
Soubor činností, které mají být vykonány v souvislosti s rezervací, je zapsán v externím programu (typicky Activator-script a Deactivator-script). Jako parametr se předává ResID. 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:
enqueue_cron(char *xid, char *resid, struct datetime from, char *format, ...)
- xid
- označení transakce, je předáváno pouze pro potřeby ladicích výpisů
- 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 job spuštěn. Jde o strukturu popsanou v "datetime.h" sestávající z int 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/crossconnect/activator.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.
- návratová hodnota
- 0 - OK, 1 - operace se nezdařila
Příklad 2:
unqueue_cron("ostrava.128.1194212749", "46@ostrava");
- Zdůrazněme, že funkce odstraní všechny úlohy Virtlabu, 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
- ručně pomocí příkazů at (stručný popis viz níže)
- výpisem tabulky na webu https://monitor.dvirtlab.net
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í jobu. 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í.
- Příklad
echo "/opt/virtlab/crossconnect/activator.sh 671@ostrava 2008-10-26 20:00:00 >/dev/null 2>&1 # RES-671@ostrava-" | at 16:58 2008-10-26
- 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.
Přímý přístup k jobům at daemona
Následující popis lze v budoucnu využít k zlepšení výkonu implementace funkce unqueue, která je nyní implementována sice "systémově čistě," ale pracuje pomaleji, než by bylo možné.
K jobům může root přistupovat i přímo prohlídkou souborů ve /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í job s normální prioritou (jiná písmena snižují prioritu, viz manuál nebo příkaz batch), 00025 značí job č. 25HEX = 37DEC, 012fbd6cHEX = 19905900DEC = unix_timestamp začátku/60 (tj. v minutách, přesněji spouštět nelze; např. v tomto případě 19905900*60 = 1194354000 = po převodu Tue, 06 Nov 2007 13:00:00 GMT). Majitel jobu = 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
Ve webu každého serveru je k dispozici /cronmon.php
, který umí vypsat všechny joby rovnou úhledně přes prohlížeč do tabulky.
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
- Měli byste vědět, že výstupy jobů jsou atd démonem odesílány poštou majiteli jobu, (tj. v případě virtlabu rootovi). Pokud se root@virtlab.cs.vsb.cz (třeba Petr G.), resp. root@virtlab.opf.slu.cz (třeba Lukáš M.) nemá osypat, provádí se nyní jejich spuštění
activate.sh 3@ostrava >/dev/null 2>&1 # RES-3@ostrava-
a obdobně
deactivate.sh 3@ostrava >/dev/null 2>&1 # RES-3@ostrava-
Příslušné pipes potlačí jakýkoliv výstup. Původní zdrojový text atd neumožňuje s výstupy naložit jinak (například posílat data místo poštou do syslogu), takže řešením by byla pouze jeho úprava. Nicméně pokud se nerozbíhají úlohy, mohlo by odesílání e-mailů mít i svůj půvab...
Ve zdrojových textech commit_table.c a dbutils.c (viz níže) je cesta /opt/virtlab/de|activate.sh sprostě natvrdo zadána bez skrupulí a konstant!