Crontab, user, időzóna

 ( SySERR | 2017. január 28., szombat - 16:34 )

Sziasztok!

Első ránézésre egy egyszerű dologra szeretnék épkézláb megoldást. A világ több pontján vannak elhelyezve szerverek. Ezeknek az órái a lehető legváltozatosabban vannak beállítva. Van aminek az órája UTC-hez van állítva, a másik gépen a helyi időhöz. Köztük van fizikai gép, VPS. Természetesen ezek is a lehető legvegyesebben. A gépek többségén Debian fut, de van 1-2 Ubuntu is. Az user választhat, hogy az alkalmazása melyik gépen induljon el, de az azon beállított időzített dolgok minden esetben a saját időzónája szerint kell indulnia cronból. A saját időzónáját az usernek tudnia kell állítani. Ezt ti hogy oldanátok meg úgy, hogy bármelyik gépen alkalmazva rendesen működjön?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

sub

man 5 crontab
The cron daemon runs with a defined timezone. It currently does not support per-user timezones.

Az internetről letölthető fcron, ami úgy néz ki hogy tudja.
http://fcron.free.fr/doc/en/fcrontab.5.html
http://fcron.free.fr

Hogy kerül a user crontabja a szerverre? Vagy ez is a feladat része? Én a crontab config konverzióra szavaznék, x forrásból át kell konvertálni helyi időre.

--

Ott kellene kiindunia a dolognak, hogy az usernek már eleve a saját időzónájában lévő időt írja ki (legyen lehetősége ezt állítani). A cron meg alkalmazkodjon ahhoz. Természetesen jöhet más ötlet is, de sima apt-get-tel telepíthető legyen a fent említett rendszerekre.

-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Tehát ha jól értem akkor a cron-t nem a user szerkeszti crontab vagy hasonló programokkal, hanem valamilyen egyedi felületen kerül beállításra, és onnan "te írod be" crontab-ba.

Ha így van, akkor én simán a date paranccsal konvertálám az időt, és az így kapott időt írnám crontab-ba a megfelelő formátuman.

date -d '12:00:00 EDT'
TZ=PT date -d '12:00:00 EDT'
TZ=Europe/Moscow date -d '12:00:00 EDT'
TZ=Europe/Moscow date -d 'Wed 19:00:00 EDT'
TZ=Japan/Tokio date -d 'Wed 19:00:00 EDT' +"%M %H %m %u %Y"

Ezzel az a baj, hogy 6 havonta simán el fog mászni az időpont (nyári időszámítás). Rosszabb esetben nem is azon napon, amikor az óra átállítás van nálunk (az USA-ban néhány héttel korábban állítják az órát). Ha automatikusan állítod, akkor meg Japánra kell figyelni, ahol nincs nyári időszámítás egyáltalán. Az időzónákkal és időkkel eszméletlen sok a szívás.
--
http://naszta.hu

Hát akkor rendszeresen újragenerálod, mondjuk minden óra 2 perckor. A másik verzió hogy hősünk keres/ír egy olyan cron daemon-t, ami képes per user más időzóna szerinti crontab kezelésére, bár ez se olyan sárkányos dolog. Fut valami script/program/daemon/whatever, benne végtelen ciklus, annak az elején megnézni hogy hány másodperc van még a következő perc 1. másodpercéig és annyit sleep-el. Amikor pedig futni kell akkor adatbázisból lekéri a cronjob-okat, az időt konvertálja, és kell valami(ke)t futtatni akkor az(oka)t elindítja (nohup, akármi), aztán ciklus vége.
Mondjuk local crontab cache-sel lehet még cifrázni, illetve nem árt mellé egy watchdog ami eéindítja ha nem fut.

Ez mindenképp iszonyat szívás lesz. Röviden összefoglalva: mindenkinek az az egyszerűbb ha minden ilyen jellegű idő UTC.
--
http://naszta.hu

Ideiglenes megoldásként jelenleg minden UTC.
De lehet ezt tovább is fokozni, de az elején már nem mertem leírni. Az egyik alkalmazás egy Wine alatt futó SAM Broadcaster amit VNC-vel ér el az ügyfél. Tehát amikor belép az ügyfél programba akkor jó lenne ha a SAM Broadcastere az user saját idejét mutatná és ezen futnának időzített műsorok. UTC meg hosszútávon azért nem jó, mert az ügyfél nem fog folyton számolgatni. 1-2 időzítésnél még belefér, de ha több műsort kell időzítve betennie akkor az már nyűg.

-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Először a feladatot kellene tisztázi!
Az user ül valahol, és tartozik hozzá egy localtime.
Az egyik szerver is ül valahol, és tartozik hozzá egy másik localtime.
Kérdés: Az user melyik localtime szerint kíván futtatni?

Minden esetben a sajátja szerint. Mintha eleve a sajét időzónájában lenne a szerver amin ügyködik.
-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Ezt én úgy csinálnám, hogy kiszámolom a nálam szükséges indítási időpont alapján az idők különbségét.
(timediff=destination_time-now)
Utána a célszerveren: at now+timediff command

Talán egy saját külön crontab+crond kellene, UTC-re beállítva, valahogy úgy elrendezve, hogy a default-tal ne akadjon össze.

sub (érdekes téma!)

Puppet szerver a baratod. ;)

Naluk tobb mint 60 Raspberry pi futott kulonbozo helyeken Amcsiban es hasonlo gondjainak voltak.
Az RPi mogott csucsult egy gateway, ami a konfigtol fuggoen vagy az RPi-t hasznalta, mint gateway-t, vagy csak a web interface-hez kellett, mint gateway.
Az openvpn-n egy csomo alkalommal nem ment, ha a certifikacio ujjabb volt, mint az adott ido az RPi boxon.

En ezt ugy oldottam meg, miutan elegem lett a manualis reszelesbol hogy felhuztam minden gepre puppet-et es tavolrol ment a "tekeres". Tudom hogy ez nyug, mert egyreszt fel kell huzni egy puppet szervert, masreszt meg a klienseket is telepiteni kell + integralni a puppet szerverbe.

De ha az elso gondokon tul vagy, akkor utanna nagyon gyorsan fog menni az uj kliens integracio.
Megeri 1x szivni vele, mert atom konnyu lesz az eleted ezutan.

Amugy nekunk az ido tenyezon kivul, meg akadt mas gond is. Pl a raspberryken futott egy dhcp kliens, ami ellenorizte a net elerest.
Ez kb. a kliensek 20%-nal beragadt es kinyirta az RPi-t, mert a memoriat+cpu-t felzabalta a gepen.

Szoval nem csak az idot fogod tudni allitani a puppet-el kozpontilag, hanem barmit el tudsz kuldeni a gepnek tavolrol.
Uj csomag telepitese, vagy pl.: daemon fut-e (hasonlo funkcio mint a monit) es ez csak egy resze a puppet-nek.
Tudom hogy ez mind kivitelezheto cron-bol, de ha barmi valtozas van, akkor johet az ujjabb belepes + reszeles.
A puppet pont arrol szol, hogy az osszes szoporollert megszuntesse es kozpontilag tudj kontrollalni mindent egy geprol.

Igazán szép az lenne, hogy ha bent vagyok rootként akkor a szerver UTC idejét mutatja.
De a 'su user' után a date már a user helyi idejét mutatná és az ott indított cronok is aszerint mennének.
A cron konvertálása oda-vissza csak félmegoldás (de a probléma nagy részét megoldaná), mert a fent említett Wine alatt futó SAM Broadcaster órájának is beállított időzóna szerint kellene mennie.

-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Ez nem tul bonyolult, nem erre gondoltal veletlenul? https://www.cyberciti.biz/faq/linux-unix-set-tz-environment-variable/
Szoval a user bash login scriptjet modositod.

De ahogy mondtam, ha fent van a Puppet, akkor tavolrol tudod ezt modositani es nem kell helyben killodni.
Masreszt a cron is "reszelheto" ezzel a modszerrel.

Erre itt van megoldas: http://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables

"0 5 * * * . $HOME/.profile; /path/to/command/to/run"

Szoval a .profile-ban lesz az idozona beallitasod a futashoz es joccakat, ami igazodik az adott felhasznalohoz.

Az első rész OK.
A másik megoldás rossz mert az időzóna beállítása még az UTC szerinti időkor állítódik be, tehát rosszkor fut le a script.

-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Ez igaz, akkor viszont marad a "reszeles" a felhasznalohoz.
Lehet hogy jobban jarsz egy fix global idovel, amit "tologatsz" ahogy a user megkivanja.

Helyette lesz egy Puppet nevu szoporollered :)

Ha nem cseszteti az ember a ruby on rails csomagokat, akkor nem tul sok gaz van vele.
En CentOS-en killodtam, de nagyon sokat. Ha megreccsen a rendszer, akkor ember legyen a talpan, aki visszahozza.
Debian-on nem volt meg gondom vele.
Amugy mar van Cisco es ESXi tamogatas is, de meg nagyon fos, csak beta verzio, legalabb is 1 eve meg csak az volt, amikor probaltam.

Alapvetoen problemam van minden konfigmenedzsment eszkozzel, mivel "management of management" ami idorablo es ahelyett, hogy megoldana problemakat, hosszu tavon csak generalja azokat.

+1
Pontosan ezt szeretném elkerülni. Minél egyszerűbb megoldás érdekel.
Ez pl. egy járható út lenne: TZ='Asia/Tokyo' majd utána elindul userként egy cron daemon ami tudja értelmezni a jelenlegi beállításokat. Ezzel a SAM Broadcaster is jó időt mutatna illetve a cronból futó dolgok is megfelelő időben indulnának.

-------------------
http://streamstat.hu/ - A legtöbb magyar rádió és TV egy helyen!

Ez nezopont kerdese, kinek a pap, kinek a papne. :)
Azert 500+ szerver felett, szerintem halott dolog egy rendszert tisztan es atlathatoan kezelni kozponti menedzsment eszkozok nelkul.

Ha hagyomanyos rendeszerekben gondolkozunk akkor mindenkepp. Ha meg nem akkor nem lehetetlen. De nem akarok offtopik lenni.

Mik azok a feltetelek ami miatt mindenfelekeppen _pont azon_ a gepen kell elindulni az adott cron jobnak?

Nekem ugy tunik mindenfelekeppen egy egyszerubb - es menedzselhetobb - megoldast kell valasztani ehelyett a buveszkedes helyett.

+1
Tódítanám egy kicsit. Mi a rossebnek cron.

Időközben meglett a megoldás.
Minden usernél el van tárolva egy fájlba az általa használt időzóna. Ezen kívül van egy crontab fájlja is, de az nem fut cronból.
Írtam egy saját scriptet ami percenként cronból lefut. A script végigmegy minden useren, a script kiolvassa a fájlból az általa használt időzónát és a szerver által használt időt átszámolja az user által használtra. Ezután az átszámolt idővel értelmezi a crontab fájlt és ha olyan talál benne akkor elindítja azt.

-------------------
https://onlinestream.hu/ - A legtöbb magyar rádió és TV egy helyen!

[Feliratkozás]