Sziasztok!
Fejleszt(ett)ünk egy C++ nyelvű, MOTIF felületű programot, amely UBUNTU 9.04 64bites rendszeren fut, Windows munkaállomásokról Xming terminálemulátoron használják.
A program időnként (szerencsére viszonylag ritkán) elszáll :-(
Az összegyűjtött core file-ok alapján az látszik, hogy jellemzően valamelyik syslog() hívásban kap SIGPIPE szignált.
A vonatkozó programsorok:
...
atexit(vege);
openlog(basename(argv[0]), LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_LOCAL0);
...
syslog(LOG_DEBUG,"%s:%d %s KFMU/ÜZM adatbázis mentése indul",__FILE__,__LINE__,AdatBazisNev);
...
void vege() {
syslog(LOG_INFO,"%s:%d ------ leállt ------",__FILE__,__LINE__);
};
Az atexit() és openlog() sorrendjét megfordítom, hiszen logikailag hibás. De mi okozza az időnkénti elszállásokat?
Köszönök minden segítséget!
arrabonus
Hozzászólások
syslogd bugnak tunik, de az is lehet, hogy siman a logrotate kozben kapd a broken pipe-ot.
csinalj egy signal handler-t, ami ujra elkuldi az uzenetet (ehhez celszeru egy uj class-t irni, ami eltarolja az uzenetet a heapen, amig biztosan el nincs kuldve)
--
NetBSD - Simplicity is prerequisite for reliability
Nem tudom, melyik syslogot hasznalja a rendszeretek, en kiprobalnam a syslog-ng-t, azzal nincs ilyen gond.
--
vmi halozatos - kommunikacios programba irtam 1x egy effele kommentetet:
mar nem nagyon emlekszem a reszletekre, de a lenyeg, hogy teljesen normalis esetben, kitesztelheto korulmenyek kozott is kaphatsz sigpipe-t, nem kell ahhoz rossz ertelemben vett "elszallas". asszem unix domain socketeknel jott elo, ugyhogy nem kizart hogy a syslog eseten is ez lehet, mert asszem az is pf_local-on megy.
joh, de akkor elveszik a log, ha nem kezeli le :)
--
NetBSD - Simplicity is prerequisite for reliability
Mindeninek köszönöm a segítséget!
Tovább nézegettem a coredump file-okat és találtam két esetet, amikor egy fprintf(stderr,...) hívás futott ugyanilyen hibára. Ekkor kezdtem gyanakodni, hogy esetleg a stderr válik elérhetetlenné.
Szerencsére sikerült reprodukálnom a hibát, így tesztelhettem egy olyan változatot, amelyikben kihagytam a LOG_ERROR flag-et az openlog() paraméterei közül. Ez a változat hiba nélkül futott.
A magyarázat röviden: az Xming ssh tunnelen keresztül futtatta az egyik programot. Ez a program bizonyos esetekben execve() hívással indított egy másikat is. A frissen indított program örökölte a szülő stderr csatornáját, ami alap esetben nem okozott gondot. Viszont, ha a szülő program ablakát bezártam, amíg a gyerek program aktív volt, akkor a gyerek elvesztette a stderr kapcsolatát, emiatt a következő syslog() hívás hibára futott :-((
arrabonus