» »

[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.

hruske ::

Ja... Poskusi z

import sys
sys.stderr = sys.stdout = open('log','w')
Rad imam tole državico. <3

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?!' ;(()

hruske ::

Jah, lahko tud nardiš svoj objekt, ki ima metodo write, npr

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()
Rad imam tole državico. <3

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.

morbo ::

Aha. Tole z /dev/null je še najbolj elegantno. Hvala obem.

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 ...

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

linux skripta

Oddelek: Pomoč in nasveti
191805 (681) Tatankas
»

Električno stikalo z oddaljenim nadzorom

Oddelek: Elektrotehnika in elektronika
131307 (826) Torx
»

Razbijanje md5 gesel na ARNES GRID-u (linux)

Oddelek: Pomoč in nasveti
333741 (2247) c3p0
»

Bash skripta

Oddelek: Programiranje
243081 (2393) poweroff
»

problem z linuxom (rabim cimprej prosim)

Oddelek: Operacijski sistemi
111411 (1227) Isotropic

Več podobnih tem