Virtlab:Komponenty/CRON

Z VirtlabWiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
Verze z 17:27, 6. 11. 2007
Dol72 (Diskuse | příspěvky)
(Nutná opatření při implementaci aktivačních/deaktivačních skriptů)
← Předchozí porovnání
Verze z 12:33, 20. 11. 2007
Dol72 (Diskuse | příspěvky)
(terminologie job (pro atd)/úloha (pro virtlab))
Následující porovnání →
Řá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í).+[[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í 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 [[Virtlab:Rezervační server|Rezervační server]] (RS), proto po odstranění AS se vše odehrává v RS. 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.
Řádka 5: Řádka 5:
=== Zařazení rezervace do cron fronty === === 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]]). 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:+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]]). 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, ...) 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ů ;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 úloha spuštěna. 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í s <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 29: Řádka 29:
unqueue_cron("ostrava.128.1194212749", "46@ostrava"); 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).+* 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ů. * 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ů.
Řádka 37: Řádka 37:
==== Stručný popis at a jeho ovládání ==== ==== 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é. ;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í ú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í.+;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í.
;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.
;atrm ''at_číslo_jobu'' : odstraní job z fronty at démona. ;atrm ''at_číslo_jobu'' : odstraní job z fronty at démona.
-===== Přímý přístup k úlohám at daemona =====+===== 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é. 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ř.: 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 -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 [http://www.linuxmanpages.com/man1/at.1.php 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; např. v tomto případě 19905900*60 = 1194354000 = po [http://www.onlineconversion.com/unix_time.htm převodu] Tue, 06 Nov 2007 13:00:00 GMT). Majitel úlohy = vlastník souboru.+kde '''a''' je aktivní job s normální prioritou (jiná písmena snižují prioritu, viz manuál nebo příkaz [http://www.linuxmanpages.com/man1/at.1.php 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; např. v tomto případě 19905900*60 = 1194354000 = po [http://www.onlineconversion.com/unix_time.htm 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 ==== ==== Vyhledání všech úkolů se známým RESID ====
Řádka 57: Řádka 57:
* testovat, zda aktivační/deaktivační skript skončil v rozumném čase * testovat, zda aktivační/deaktivační skript skončil v rozumném čase
* testovat výsledek skriptu * testovat výsledek skriptu
-* Měli byste vědět, že výstupy úloh jsou '''atd''' démonem odesílány poštou majiteli úlohy, (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í např.+* 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í např.
activate.sh 1194361920 3@ostrava >/dev/null 2>&1 # RES-3@ostrava- activate.sh 1194361920 3@ostrava >/dev/null 2>&1 # RES-3@ostrava-
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...

Verze z 12:33, 20. 11. 2007

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). 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í s 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/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 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 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í 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í.
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

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í např.
activate.sh 1194361920 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...

Osobní nástroje