» »

[Rešeno] crontab job looper v Pythonu - neki mi ne gre...

[Rešeno] crontab job looper v Pythonu - neki mi ne gre...

HotBurek ::

Dobro jutro.

V Pythonu pišem kdo, kjer bi rad cron job oz. Python za-loop-al.

Ko prvič poženem Python, ta naredi job, ki se bo izvedel v naslednji minuti. In v tem job-u izvede ravno to isto Python skriptko, ki prepiše trenutni job in ga postavi 1 minuto v prihodnost.

No to, ta zadnje, mi ne dela. Kaj delam narobe?

----

UPDATE

Zadevo sem rešil z ogledom /var/log/syslog, ki pravi:
Mar 11 21:48:01 debian cron[531]: (*system*test1) RELOAD (/etc/cron.d/test1)
Mar 11 21:48:01 debian cron[531]: (*system*test1) ERROR (Missing newline before EOF, this crontab file will be ignored)


Še izsek python kode:
# compile cron line
cronline = str(minute) + " " + str(hour) + " * * * root " + str(command) + "\n";


Ko sem na koncu dodal "\n" in ponovno zagnal, je začelo loop-at. Ka si ti nor!:D
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Ahim ::

Super, da si resil problem in opisal resitev, je pa najbrz za ve, ki bodo temo prebrali, smiselno napisat se drugi fail v tvojem pocetju. Ce ze hoces nek job izvajati vsako minuto in za to ustvariti nek svoj sistem, potem daj v crontab eno vrstico, ki se izvede vsako minuto (* * * * *) in pozene kodo, ki ti pripravi job, nato pa takoj izvede ta job, namesto da mutis s prepisovanjem crontab fajla vsako minuto ...

HotBurek ::

Gre za dva primera.

Prvi primer ima job1 in job2. Ko se job1 konča, se naj štarta job2. Načeloma bi to lahko rešil z subprocess.Popen, a sem se odločil za cron.

Drugi primer je job3, njegov čas izvajanja bo variral (čas izvajanja bo rastel zaradi količine podatkov v db), treba pa ga bo stalno ponovno zaganjat. Tu pride v poštev ta rešitev; job3 se štarta, dela 7 minut, ob koncu se prepiše cron z štartom 2 minute v prihodnosti, job3 pa se konča.
Čez 2 minute cron ponovno štarta job3, ta dela 7 minut in potem spet prepiše cron 2 minute v prihodnosti.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

Ahim ::

Uff .. ne vem kje naj sploh zacnem ...

Tale primer z job1 in job2 je ocitno dejansko samo en job, ki pac pozene dve komandi. Ce se poganja periodicno, potem je crond smiselna resitev za to.

Job3 pa se poganja 2 minuti po tem, ko se zakljuci prejsnja izvedba. Naredi skripto, ki poganja job3 v neskoncni zanki, vmes pa
sleep 2m
. Za bolj zanesljivo delovanje (retsart po zagonu, ce crkne iz kakega razloga itd.) uporabi supervisord, ki naj poganja skripto namesto da jo zazenes ti.

V glavne m - packanje po crontab fajlu je nesmisel.

Irbis ::

Kaj pa, če raje narediš .bat, v njem pa takole:
:zanka
python nekaj.py
timeout /t 60 /nobreak
goto :zanka

HotBurek ::

Job1 in job2 sta dve Python skripti; prvo požene cron 1x na dan, ta druga mora štartati potem, ko se prva zaključi.

Job3 (spet Python skripta) pa mora loop-at v nedogled. Tisto, kar sem sprva želel je, da se pred ponovnim zagonom naredi pavza 6 sekund. Cron to ne omogoča, ker dela na minuto.

Razen, da bi job3 poganjal preko supervisord, ne vem, kako bi to bolj lažje rešil, da skripta preživi ssh logout?

Zdej, kar se tiče 2 minute pavze. Sprva sem imel v planu 1 minuto, a sem šel na 2 minute. To pa zato, če bi se slučajno zgodilo, da skripta ob 01:59:59 prebere uro in minuto, potem pa ko rabi zapisat cron job na:
00 02 * * *
Bi v teoriji lahko trajalo dve, tri sekunde (server preobremenjen, diski za-lag-ajo) in bi ob 02:00:01 vpisal job, katerega bi cron že zamudil (tega nisem testiral, zgolj... well, ugibam). Če to drži, bi potem rabil 24 ur, da se ponovno štarta.

Ker trenutno delam bolj prototip, proof-of-koncept, ter hkrati ne poznam supervisord, bom do nadaljenga uporabljal kar Python, da si sam sebi piše nov cron ob koncu job-a.

A če zadeva pride kdaj na višji novi in se bodo začele pojavljati težave, potem ja, bom pogledal supervisord. Zgleda, da je točno temu tudi namenje. Tako da hvala za omembo tega software-a.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

Ahim ::

Se pravi namesto da ti cron pozene job1 in nato ti nekaj caras, da se pozene job2, naj pac cron pozene eno skripto, ki en za drugim pozene tako job1 kakor job2.

Glede drugega dela problema z job3 je pa odgovor se vedno enak - skripta z neskoncno zanko (while true do ... done), po job3 komandi pa ustrezen sleep ... tudi 6 sekund je lahko, ce ti tako pase.

Ne razumem zakaj bi izvajanje nekaj stvari, ki jih poganja cron, kakorkoli bilo povezano s SSH sejo, ampak ce bi ze rad nekaj sam pognal na roke pa da ta proces ostane aktiven ne glede na to ali se ti SSH povezava prekine, uporabi terminalski multiplekser (tmux, screen).

HotBurek ::

Ne razumem zakaj bi izvajanje nekaj stvari, ki jih poganja cron, kakorkoli bilo povezano s SSH sejo, ...

Job3 ne poganja cron, ampak ga je potrebno ročno zagnati, potem pa sam loop-a z uporabo subprocess popen. Sam sebe ponovno štarta.

Sem pa uredil, da v primeru restarta serverja, cron ponovno zažene job3 ob zagonu.

Testirano in deluje.

@reboot root /usr/bin/python3.9 /path/to/script.py
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Cron problem

Oddelek: Operacijski sistemi
5850 (676) c3p0
»

[c# .net] Iskanje datotek

Oddelek: Programiranje
111871 (1591) Evolve
»

Php skript

Oddelek: Izdelava spletišč
13688 (480) DeeCoy
»

prošnja za izgradnjo programa!

Oddelek: Programiranje
121827 (966) vorantz
»

[Python, Linux] Poganjanje skripte s crontab

Oddelek: Programiranje
71467 (1290) morbo

Več podobnih tem