Forum » Programiranje » [Python, Linux] Poganjanje skripte s crontab
[Python, Linux] Poganjanje skripte s crontab
morbo ::
Imam eno 'hecno' obnašanje pri poganjanju python programa s crontab-om.
Torej, program pobere neke podatke z neta in jih shrani v bazo. Iz IDEja in konzole dela vse ok, nobenih napak. Iz crontaba ga poganjam preko .sh skripte in tukaj se zagusti:
1.) Če .sh poženem z 'bash /pot/skripta.sh', se python program prekine nekje na polovici izvajanja - podatki se napol zapišejo v bazo
2.) Če v crontab dodam preusmeritev stderr-ja v nek fajl: 'bash /pot/skripta.sh 2>err.log', potem se python program izvede v celoti - vsi zapisi so v bazi, ampak err.log je poln 'IOError: Broken pipe' (iz modula logging) za menda vsak (stdout) log zapis v programu.
3.) Če v crontab dodam preusmeritev stderr in stdout: 'bash /pot/skripta.sh > err.log 2>&1', potem se program izvede uspešno in v log datoteki ni nobenih napak.
Zagon iz konzole brez preusmeritev program uspešno izvede.
A mi lahko kdo osvetli kaj se tukaj dogaja?
Loggerji v programu zapisujejo v datoteke in sys.stdout, sys.stderr - najbrž je tukaj srčika problema, crontab (pod)procesu je potrebno nujno dati nekaj kamor naj pošilja output? Priznam da sem le povprečen poznavalec Linuxa.
Torej, program pobere neke podatke z neta in jih shrani v bazo. Iz IDEja in konzole dela vse ok, nobenih napak. Iz crontaba ga poganjam preko .sh skripte in tukaj se zagusti:
1.) Če .sh poženem z 'bash /pot/skripta.sh', se python program prekine nekje na polovici izvajanja - podatki se napol zapišejo v bazo
2.) Če v crontab dodam preusmeritev stderr-ja v nek fajl: 'bash /pot/skripta.sh 2>err.log', potem se python program izvede v celoti - vsi zapisi so v bazi, ampak err.log je poln 'IOError: Broken pipe' (iz modula logging) za menda vsak (stdout) log zapis v programu.
3.) Če v crontab dodam preusmeritev stderr in stdout: 'bash /pot/skripta.sh > err.log 2>&1', potem se program izvede uspešno in v log datoteki ni nobenih napak.
Zagon iz konzole brez preusmeritev program uspešno izvede.
A mi lahko kdo osvetli kaj se tukaj dogaja?
Loggerji v programu zapisujejo v datoteke in sys.stdout, sys.stderr - najbrž je tukaj srčika problema, crontab (pod)procesu je potrebno nujno dati nekaj kamor naj pošilja output? Priznam da sem le povprečen poznavalec Linuxa.
hruske ::
Ja... Poskusi z
import sys sys.stderr = sys.stdout = open('log','w')
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
morbo ::
^ tega nočem, ker mi bo med konzolnim poganjanjem vse preusmerjalo v fajl. Ta rešitev je enaka kot preusmeritev v bash-u, le da manj fleksibilna. V bistvu sem preživel z obliko pod točko 3)...
Obstaja kak bash ukaz, switch, ki bi procesu povedal naj ignorira output? Ali ga je potrebno nujno speljati nekam? Sej ni da je to neka huda ovira, samo zanima me... (pravzaprav zdaj vidim da tale problemčič ni niti vreden svoje teme, ampak takrat se mi je zdelo 'woohaa, kaj hudiča se tukaj dogaja?!' )
Obstaja kak bash ukaz, switch, ki bi procesu povedal naj ignorira output? Ali ga je potrebno nujno speljati nekam? Sej ni da je to neka huda ovira, samo zanima me... (pravzaprav zdaj vidim da tale problemčič ni niti vreden svoje teme, ampak takrat se mi je zdelo 'woohaa, kaj hudiča se tukaj dogaja?!' )
hruske ::
Jah, lahko tud nardiš svoj objekt, ki ima metodo write, npr
Oz. lahko greš še korak dlje in izpis onemogočiš zgolj v primeru da ne poganjaš skripte interaktivno:
class Foo: def write(self, s): pass
Oz. lahko greš še korak dlje in izpis onemogočiš zgolj v primeru da ne poganjaš skripte interaktivno:
import sys class Foo: def write(self, s): pass if not sys.stderr.isatty(): sys.stderr = sys.stdout = Foo()
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
Zgodovina sprememb…
- spremenilo: hruske ()
infiniteLoop ::
stdout in stderr lahko preusmeris tudi v /dev/null ce noces meti fajla
None of us is as dumb as all of us.
b ::
Ampak... Saj cron prestreže stdout in ti ga pošlje na mail, za stderr pa ne vem. Zakaj to tebi ne dela? Jaz redno dobivam par MB cron maile z enega strežnika...
morbo ::
Če se ne motim moraš za to imet v spremenljivki MAILTO naslove, kamor potem cron pošilja output. Ampak jst tega ne rabim. Pravzaprav ne rabim da mi pri poganjanju te skripte cron sploh kam zapisuje stdout, ker imam v python programu vsa output pokrit z loggerji. In ker mi debug logger izpisuje v stdout / stderr (za potrebe konzolnega poganjanja) in hkrati tudi v datoteko (za takrat ko laufa samodejno), je prihajalo do težav ko v cron jobu ni bil določen redirect.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | linux skriptaOddelek: Pomoč in nasveti | 1914 (790) | Tatankas |
» | Električno stikalo z oddaljenim nadzoromOddelek: Elektrotehnika in elektronika | 1389 (908) | Torx |
» | Razbijanje md5 gesel na ARNES GRID-u (linux)Oddelek: Pomoč in nasveti | 3936 (2442) | c3p0 |
» | Bash skriptaOddelek: Programiranje | 3262 (2574) | poweroff |
» | problem z linuxom (rabim cimprej prosim)Oddelek: Operacijski sistemi | 1459 (1275) | Isotropic |