Tenemos por ahi una aplicación corriendo en Ruby on Rails (ROR). En Debian Etch (stable), sin embargo para utilizarla de manera nativa nos encontramos con que usarla como fast cgi en Apache 1.3.x es por decirlo de una manera bonita, extremadamente dificil.
Asi que usamos un backport de mongrel… primer problema, mod_proxy que en apache 2.2.x ha mejorado enormidades, en apache 1.3.x funciona, pero con sus asegunes… entonces pense en hacer aptitude install apache2… sin embargo creo es mejor a que acabe el semestre antes de migrar mis cosas a apache2.
Por otro lado estuve haciendo strace del mongrel antes de que por sugerencia de mi compañero sysadmin se implementara mongrel_cluster + pound + apache_mod_proxy :D
Total que en su ultima corrida como mongrel_rails…
Tan solo nos quedamos con este error.
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
— SIGSEGV (Segmentation fault) @ 0 (0) —
write(2, «/home/webapps/railapp»…, 94) = 94
write(2, «[BUG] «, 6) = 6
write(2, «Segmentation fault», 18) = 18
write(2, «\nruby 1.8.5 (2006-08-25) [i486-l»…, 39) = 39
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
tgkill(16616, 16616, SIGABRT) = 0
— SIGABRT (Aborted) @ 0 (0) —
rt_sigprocmask(SIG_BLOCK, [ABRT], NULL, 8) = 0
rt_sigaction(SIGABRT, {SIG_DFL}, {0xb6e49060, [ABRT], SA_INTERRUPT}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
tgkill(16616, 16616, SIGABRT) = 0
— SIGABRT (Aborted) @ 0 (0) —
Process 16616 detached
Y en los logs
mongrel.8202.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] rb_gc_mark(): unkno
wn data type 0x25(0xbff08948) non object
mongrel.8204.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:127.0.0.1 – [Wed, 23 Apr 2008 07:24:27 GMT] «GET /centers/list HTTP/
1.1″/usr/lib/ruby/1.8/mongrel/debug.rb:180: [BUG] Segmentation fault
mongrel.log:/home/webapps/railapp/vendor/plugins/will_paginate/lib
/will_paginate/finder.rb:155: [BUG] rb_gc_mark(): unknown data type 0x0(0x8e3711
8) non object
mongrel.log:/usr/lib/ruby/1.8/mongrel/stats.rb:44: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/mongrel/debug.rb:180: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/home/webapps/railapp/vendor/rails/activerecord/lib/ac
tive_record/connection_adapters/postgresql_adapter.rb:87: [BUG] Segmentation fau
lt
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
…
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
mongrel.log:/usr/lib/ruby/1.8/cgi/session.rb:166: [BUG] Segmentation fault
Haciendo un par de busquedas en google (bueno más que un par) no econtre ningun ticket abierto en Debian, Ruby o Mongrel :/, asi que seguimos con una solución a la medida que cuando pesca que mongrel se muere lo reinicia…
Originalmente habia hecho uno muy rudimentario, pero que igual a alguien mas le podria servir, asi que pongo mi script de bash.
[code=’Bash’]
#!/bin/sh
# start mongrel if dies
#TEST=`ps xaf | grep mogrel_rails | grep -v grep | wc -l`
TEST=`ps xaf | grep «/usr/bin/ruby1.8» | grep -v grep | wc -l`
#echo $TEST
if [ $TEST == 0 ] ; then
# Hard coded
rm /home/webapps/railapp/log/mongrel.pid
echo «Mongrel ha muerto, borrando su pid»
/etc/init.d/mongrels start
echo «levantando»
fi
exit 0
[/code]
Como nota interesante si mongrel se muere con segfault no borra su pid, por lo tanto no es posible iniciarlo sin borrar el pid primero, claro que mi script seria más eficiente si mejor leyera el pid, lo buscara contra los procesos y solo si no lo encuentra entonces si levantara a mongrel, pero como necesitabamos un quick hack ese día, asi se quedo.