[MEGOLDVA] syslog(), SIGPIPE

Fórumok

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


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

vmi halozatos - kommunikacios programba irtam 1x egy effele kommentetet:


        /* well, it's turned out to be necessary: */
        signal(SIGPIPE,SIG_IGN);

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.

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