másodperc pontosságú feladatütemezés Linuxon

Felmerült bennem az őrült igény, miszerint másodperc pontossággal szeretnék job-ot indítani. Erre a hagyományos unix daemonok nem látszottak megfelelő segítséget nyújtani. Gányoltam sleep-eléssel a megadott idopont előtti egész perckor elindított job-ban, de az nem az igazi, mert ugyebár akkor a job már elindult és pl. az "utolsó pillanatban" nem lehetne törölni.

Bohó opensource aktivistához hűen bele is másztam először az `at' ősi forráskódjába - mondván talán az kisebb falat lesz mint a cron.
És még a vártnál is egyszerűbbre sikeredett a "sec-prec" (seconds precision) patch: Ugye az at-nek `-t' kapcsolóval meg lehet adni az indítási időt, viszont direkt úgy írták meg, hogy ne vegye figyelembe, csapja le a másodperceket!
Tehát miután töröltem a `timer -= timer % 60' sort így nagyjából megoldottam a topic indító problémát, még maradt is időm egy párat fícsörözni: az at job-ot az aktuális (at parancs meghívásakori) SHELL-lel futtassa; report email-ben X-At-Job header-ben adja vissza a job számát; az üzeneteiben ne paddolja feleslegesen space-ekkel a job számát.

Különben annak apropóján jött az igény, hogy az email kiszolgálómon megvalósítsam az Undo funkciót. Ehhez annyi kellett, hogy az exim freezelje a kiküldött leveleket, de ütemezzen az adott queue_id-ra egy thaw-ot is. Amíg a levelem freeze-ben van, tudom onnan törölni megvalósítva ezzel az Undo műveletet. Az Undo grace period-ot általában 10-60 mp közé érdemes állítani (nálam per-user beállítás és default 50). Ez egy olyan intervallum, aminek az eleje és vége is eshet ugyanazon percbe, így a perc-alapú cron kiesik, mert pl. freeze-elés és a thaw ütemezése történik x perc 10 mp-kor, akkor magát a cron job-ot x perc 0 mp-re kellene ütemezni plusz 50 mp sleep-pel. Ilyenkor sose fut le a job. Következő percre ütemezni? Akkor megbízhatatlan, kiismerhetetlen lenne a rendszer: hol annyit vár amennyit kell, hol kevesebbet? meg különben is, menjen tovább az az email, hacsak lehet.

a patch itt van:
http://pastebin.com/xh2HnZ0T
http://pastebin.com/09hjm2sX

Hozzászólások

man at:
At and batch as presently implemented are not suitable when users are competing for resources. If this is the case for your
site, you might want to consider another batch system, such as nqs.

Kivancsi lennek kihajtott rendszeren mennyit "kesik".

ja persze, késés az mindig lehet. nekem alapvető felfogásom, hogy a computer architektúrák ahogy most léteznek, nem az általánosan értelmezett idő keretein belül működnek. ezt most nagyon félreérthető így olvasni, de nehéz megfogalmaznom. tehát még hogy ha az adott rendszernek van is egy belső órája (vegyük ezt a pontos időnek), ami alapján tud processzeket indítani, a processzor feladatai event-alapúak, bármikor várhat bármennyit időt disk IO, terminal IO műveletekre. úgyhogy bármilyen óra-perc-féle "világidőről" legyen szó, az csak alsó határidőt jelenthet valójában. ezt szokták úgy is megfogalmazni, hogy "ha nagy a load, késhet ez meg az". ha olyan pontosak akarunk lenni, hogy pl. egy "02 08 * * * date" cron job 08:02 percet írjon ki a kimenetére, az még alacsony load mellett se garantált.

szerintem bármennyit késhet. egy oprendszer összetettségű rendszeren meghatározatlan. és az at kódjában nem is láttam olyan "késésmérőt", mint a vix cron-ban (ott asszem ha a meghatározott futtatási idő után 3 perc múlva jutna el egy job futtatásáig, akkor nem futtatja).

kösz a tippet, ezt az nqs-t megnézem.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

Olvass utána a valósidejű rendszereknek, ott felső határa is van a processzeknek.

Illetve a probléma abból ered, hogy egy olyan feature-t akarsz, amit alapesetben az e-mail szoftverrendszered nem tud, ezért megpróbálod emulálni más szoftverrel - több-kevesebb sikerrel.

systemd.timer(5), kombinalva incronnal csodalatos dolgokra kepes, de tobb esetben incron sem kell.

Persze ezzel megnyered a teljes systemd stuffot, ami egyeseknel kiveri a biztositekot.

--
|8]

Az exim -nek meg tudod adni, hogy queue_only, az nem elég? Elvileg azert az SMTP nem az a protokoll, aminek ASAP SOS FONTOS kell mukodnie, csak a tuggyukhol :)

queue_only-val nem tudom megmondani, mikor kerüljön ki a queue-ból. adott esetben a queue runner hamarabb is ráfuthat, mint ahogy az undo grace time lejár. és routing fázisban is előfordulhat hogy nem akarom egyből továbbküldeni (control = queue_only csak ACL fázisban van).

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

alapvetően az exim adottságai elegendőek az általam vizionált email kiszolgálóhoz. apróbb igények vannak, amiket viszont jól hozzá lehet eszkábálni segédszkriptekkel. ez az undo funkció épp egy kiugró dolog volt, amiatt mert nincs az exim-ben olyan állapota az email-nek, hogy "álljál meg de pontosan megmondom, hogy meddig". multiqueue kezeléssel vagy per-message retry értékekkel lehetne még szépen és rendeltetésszerűen megoldani, de ezeket a funkciókat még nem írták bele.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

Multkor ilyenre volt szuksegem, es node.js-ben csinaltam meg,
milliszekundumra lehet idoziteni.


var main = function(){
var min = config.recurrenceMin;
var max = config.recurrenceMax;
var interval = Math.floor(Math.random() * (max - min + 1)) + min;

checkLocalJobs()
.then(executeLocalJobs)
.then(getRemoteJobs) //which are already in remotequeue
.then(updateRemoteQueue)
.spread(processResponse)
.spread(addToRemoteQueue)
.catch(function(error) { // error handling});

setTimeout(function() { main(); }, interval); // recursiveness for the win!:)
};

setTimeout-rol bovebben: https://nodejs.org/docs/v0.6.1/api/timers.html

Ebben az a jo, hogy random idokozonkent (tol-ig, pl: 5-10sec) lefut, de ha sok melo gyult fel, mig aludt, akkor tobbet is lefuttat (sorkezeles, miegymas).

Egy ideje fut mar a kod (november) eles kornyezetben, teljesen jol muzsikal.
Parat kihagytam a sorbol, hogy atlathatobb legyen, de rengeteg melot aszinkron modon fel lehet fuzni igy. Ha egy melo van, akkor .then(),
ha tobb van (egy tombben levo melok), akkor .spread().

Az executeLocalJobs egyebkent egy shell szkriptet hiv meg, amirol progress-t jelenti remote szerverre (stdout streamet figyeli, es aszerint kuld egy-egy HTTP POST-ot).

---
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

de miert az at/cron-t akarod megeroszakolni, ahelyett, hogy irnal egy demont, ami elindul aztan az idok vegeig csinalja a dolgat?

--
"nem tárgyszerűen nézem a dolgot, hanem a vádló szerepéből. Sok bosszúságot okoztak, örülnék ha megbüntetnék őket - tudom gyarló dolog, de hát nem vagyok tökéletes." (BehringerZoltan)

nagyobb az adminisztratív költsége 0-ról megvalósítani valamit mint ráépíteni egy-egy meglévő framework-re. az at/cron-t én a feladat ütemezés frameworkjének tekintem. kétségtelen, hogy már nem túl modern, vannak hiányosságai, nem illeszkedik minden feladathoz. de minden kicsit speciálisabb job-hoz írjunk saját ütemező réteget, vagy csináljunk egy újabb/jobb schedulert, ami megfelel a kor technológiájának és amire rákapcsolhatjuk a mai szoftverek ütemezendő cuccait? én a 2. mellett vagyok.
amúgy az at másodpercesítése nem tarozik a modernizált scheduler íráshoz :-)

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

esetleg csinalhatnal egy sajat daemont, aminek atadod az osszes kimeno levelet (mint ahogy a clamav/spamassist/stb-nek atadjak: google://exim+outgoing+mail+filter ), ez ul a levelen 1 percig, majd megnezni hogy nincs-e ilyen fajl: var/run/pleaseundomymailvagyakarmi/12345ID, ha nincs akkor visszaadja a levelet az eximnek tovabbitasra.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Ezzel csak az az egyetlen gond, hogy attol tetted fuggove a job elindulasat, hogy az adott idopillanatban sikerul-e vezerlest kapnia az idozito szerkezetednek. Ha valamiert szenne van terhelve a gep, es 15:00:00-15:00:02 kozott eppen nem kap vezerlest az atd, akkor a 15:00:01-kor elinditando processz nem fog elindulni sohasem. Hogy miert? Mert az ora a processzortol tobbe-kevesbe fuggetlenul ketyego dolog a szamitogepben, es a leolvasas kvazi barmikor kimaradhat, ha a proci epp nem er ra a te folyamatoddal foglalkozni. Nem veletlen, hogy a vilagon mindenki percre igazitottan idozit, vagy max 10-20 masodpercenkent futtat meg dolgokat. Az ennel pontosabb idoziteshez vagy demont, vagy valamilyen mas task-monitoring megoldast alkalmaznak, ahol nem idozitenek semmit, hanem maga a szofter varja ki a szukseges idot, es van benne egy jo adag hibatures is (ha a delta T nagyobbegyenlo mint, akkor vegrehajt, egyebkent wait).

Az, amit itt leirtal, az a nagyon csunya ganyolas kategoria, es production gepen ilyenert kezletores jar.
--
Blog | @hron84
Üzemeltető macik