Forum » Programiranje » [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:
Še izsek python kode:
Ko sem na koncu dodal "\n" in ponovno zagnal, je začelo loop-at. Ka si ti nor!
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!
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
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.
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
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
V glavne m - packanje po crontab fajlu je nesmisel.
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
: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.
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
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).
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.
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
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Cron problemOddelek: Operacijski sistemi | 850 (676) | c3p0 |
» | [c# .net] Iskanje datotekOddelek: Programiranje | 1871 (1591) | Evolve |
» | Php skriptOddelek: Izdelava spletišč | 688 (480) | DeeCoy |
» | prošnja za izgradnjo programa!Oddelek: Programiranje | 1827 (966) | vorantz |
» | [Python, Linux] Poganjanje skripte s crontabOddelek: Programiranje | 1467 (1290) | morbo |