[devel] [Monit] SIGSEGV ][

Igor Homyakov =?iso-8859-1?q?homyakov_=CE=C1_ramax=2Espb=2Eru?=
Пт Авг 29 15:01:14 MSD 2003


Экспериментальным путем выяснилось что этот именно резолвер.

workaround:
 - писать полный e-mail в alert, то есть вместо
   alert admin
   хотя бы    
   alert admin на localhost

 - всегда писать по какому IP проверять соединение,
   вместо
   port 22 use proto ssh
   писать
   host 10.4.1.10 port 22 use proto ssh

SIGSEGV имеет весьма интересное свойство, если смотреть traceback
то валиться совершенно в другом мечте (например у меня падало на 
вызове syslog, а при отладке казалось что память портил перед этим sprinf)

вот что по этому поводу сказал Ulrich Drepper:
Every program which crashes is glibc's fault.  Get real. 
Any malloc operation after a heap corruption will cause the
program to crash at the next allocation.  A bug in the
program before a syslog() call will cause syslog to fail but
it is not the cause.

танцы с glibc-nss-2.2.6-alt0.3 мне в своё время не помогли

* Michael Shigorin <mike на osdn.org.ua> [030821 16:32]:
> On Wed, Sep 25, 2002 at 01:45:53PM +0400, Dmitry V. Levin wrote:
> > > > > > > > > У меня странная картина, monit из Сизифа валиться на пустом месте 
> > > > > > > > > с SIGSERV. А собранный локально нормально работает.
> > > > > > Если приложение многопоточное и при этом нити используют get{host,net}by*,
> > > > > > то 99% что #0001259; traceback при этом ведет в libnss_XXX.
> > > > В таком случае применимы те же workaround'ы, что и для mysqld.
> > glibc-nss-2.2.6-alt0.3

> Так.  А что делать, если локально собранный 3.2-alt1 имени Игоря
> валится, причем даже при /etc/monitrc вида

> ---
> set daemon 120
> set logfile syslog
> set mailserver localhost
> set mail-format {
>         from: root на inmetex.com.ua
>         subject: [monit] -- $PROGRAM $EVENT on $HOST at $DATE
>         message:
> }
> check syslogd with pidfile /var/run/syslogd.pid
>         start program = "/etc/init.d/syslogd start"
>         stop  program = "/etc/init.d/syslogd stop"
>         alert admin 
>         group system
> ---

> (разумеется, /var/run/syslogd.pid существует и содержит правильный PID)

> Конец strace -ff выглядит так:

> ---
> read(4, "127.0.0.1\t\tlocalhost.localdomain"..., 4096) = 43
> read(4, "", 4096)                       = 0
> close(4)                                = 0
> munmap(0x123000, 4096)                  = 0
> uname({sys="Linux", node="trickster.inmetex", ...}) = 0
> read(3, "", 8192)                       = 0
> ioctl(3, TCGETS or SNDCTL_TMR_TIMEBASE, 0xbffff270) = -1 ENOTTY (Inappropriate ioctl for device)
> close(3)                                = 0
> munmap(0x122000, 4096)                  = 0
> stat64("/var/run/syslogd.pid", {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> stat64("/var/run/syslogd.pid", {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> open("/var/run/syslogd.pid", O_RDONLY)  = 3
> fstat64(3, {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x122000
> read(3, "1186\n", 4096)                 = 5
> close(3)                                = 0
> munmap(0x122000, 4096)                  = 0
> getpgid(0x4a2)                          = 1186
> getuid32()                              = 0
> stat64("/var/run/monit.pid", 0xbffff770) = -1 ENOENT (No such file or directory)
> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
> +++ killed by SIGSEGV +++
> ---

> touch /var/run/monit.pid или помещение туда несуществующего PID =>

> ---
> stat64("/var/run/monit.pid", {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> stat64("/var/run/monit.pid", {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> open("/var/run/monit.pid", O_RDONLY)    = 3
> fstat64(3, {st_mode=S_IFREG|0644, st_size=5, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x122000
> read(3, "2325\n", 4096)                 = 5
> close(3)                                = 0
> munmap(0x122000, 4096)                  = 0
> getpgid(0x915)                          = -1 ESRCH (No such process)
> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
> +++ killed by SIGSEGV +++
> ---

> Помещение туда PID "левого" существующего процесса приводит к отправке ему
> SIGUSR1 и счастливому завершению monit:

> ---
> stat64("/var/run/monit.pid", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
> stat64("/var/run/monit.pid", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
> open("/var/run/monit.pid", O_RDONLY)    = 3
> fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x122000
> read(3, "31193\n", 4096)                = 6
> close(3)                                = 0
> munmap(0x122000, 4096)                  = 0
> getpgid(0x79d9)                         = 31193
> kill(31193, SIGUSR1)                    = 0
> write(2, "monit daemon at 31193 awakened\n", 31monit daemon at 31193 awakened
> ) = 31
> _exit(0)                                = ?
> ---

> Для удобства:
> ftp://ftp.altlinux.org/pub/people/mike/misc/monit-3.2-alt1.src.rpm

> -- 
>  ---- WBR, Michael Shigorin <mike на altlinux.ru>
>   ------ Linux.Kiev http://www.linux.kiev.ua/




-- 
Igor V. Homyakov                         RAMAX International
System Administrator         Banking Technologies Department
<igor.homyakov(at)ramax.ru>              http://www.ramax.ru



Подробная информация о списке рассылки Devel