ruby on rails - No se puede detener WEBrick 1.3.1 con ctrl-c en Ubuntu 11.04
ruby-on-rails ruby-on-rails-3 (13)
Creo que ^C
no puede matar a los servidores de WEBrick porque el servidor crea una nueva sesión:
En webrick/server.rb
:
class Daemon def Daemon.start exit!(0) if fork Process::setsid exit!(0) if fork Dir::chdir("/") File::umask(0) STDIN.reopen("/dev/null") STDOUT.reopen("/dev/null", "w") STDERR.reopen("/dev/null", "w") yield if block_given? end end
(Existe un código muy similar en rack/server.rb
, por lo que si está iniciando WEBrick a través del rack, es posible que desee dejar desactivadas las opciones de línea de comandos -D
o --daemonize
).
Y de la página de setsid(2)
:
setsid() creates a new session if the calling process is not a process group leader. The calling process is the leader of the new session, the process group leader of the new process group, and has no controlling tty.
no tiene tty controladora significa que las señales generadas por un terminal ( ^Z
SIGTSTP
, ^/
SIGKILL
, SIGTTIN
, SIGTTOU
, etc.) no pueden alcanzar el proceso aunque se haya iniciado en ese terminal. El enlace ha sido cortado.
Estoy usando RVM, Ruby 1.9.2 y Rails 3.0.7
Una eliminación estándar del proceso desde otra terminal tampoco funciona, pero matar -9 sí, por supuesto.
Encontré una pregunta similar, CTRL + C al servidor Webbrick ignorado , pero no está claro si esa pregunta describe el mismo problema subyacente. Además, la resolución no parece aplicarse, ya que no estoy usando: git en mi Gemfile.
actualización 1: (antiguo ahora ... ver la actualización 2, a continuación, para la primicia real)
Logré reducir el problema a una sola gema. Si obtienes el siguiente script de prueba, también puedes ver el problema (suponiendo que estés en Ubuntu 11.04 ... no hubo ningún problema en 10.04)
rm -rf tmpkilltest
rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest
gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri
rails new tmpkilltest
cd tmpkilltest
echo "gem ''barista'', ''1.0''" >> Gemfile
bundle
rails s
El hecho de que el problema esté causado por la interacción de Rails con una gema me lleva a creer que esta pregunta en realidad está relacionada con CTRL + C al servidor Webbrick ignorado , aunque el caso de prueba anterior muestra que esto claramente no se debe a: git por una joya.
actualización 2:
En la actualización 1 mencioné que lo reduje a una gema. Cuando revisé esa gema, finalmente encontré al verdadero culpable. La gema estaba haciendo una sola llamada al sistema. He hecho una pequeña modificación en el guión de prueba donde ya no cargo la gema barista, sino que simplemente agrego una sola llamada al sistema al final de la aplicación.rb. Con esa llamada al sistema, ctrl-c no funciona. Elimine la llamada al sistema y funciona.
rm -rf tmpkilltest
rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest
gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri
rails new tmpkilltest
cd tmpkilltest
bundle
echo "/`date/`" >> config/application.rb
rails s
Esto podría explicar la aparente similitud entre esta pregunta y CTRL + C al servidor Webbrick ignorado . Mi corazonada es que la gema que mencionan también hace una llamada al sistema.
Encontrado algún tipo de solución. Ejecutar en la terminal:
stty -echoctl
Y luego Ctrl-C funcionará. http://linux.m2osw.com/remove-ctrl-C-from-being-printed-in-console
Trabajó solo por una sesión. Publicado mejor solución cerca.
Esto también me está sucediendo en Mac OS X.
Sorprendentemente, ni Rack
ni WEBrick
están configurando manejadores de señal personalizados. Puse esto en el método de call
mi aplicación de rack y me dice que el controlador DEFAULT
para SIGINT es el actual (devuelve la cadena "DEFAULT"
):
p Signal.trap(''INT'', ''DEFAULT'')
Sospecho que algo está sucediendo en ruby''s select
que atrapa las señales.
Aquí hay 2 maneras de detenerlo en el servidor:
1) Presione ctrl-z para suspender. A kill -ABRT pid_or_job_id
. Sin embargo, no sé qué tan "limpio" es el proceso. Esto es molesto, pero no tiene que agregar ningún código.
2a) Si está utilizando Rack, agregue este derecho antes de llamar a Rack::Handler::WEBrick.run
:
Signal.trap(''INT'') {
Rack::Handler::WEBrick.shutdown
}
2b) Si está utilizando vainilla WEBrick
:
Signal.trap(''INT'') { server.shutdown }
donde el server
es su objeto de servidor WEBrick
.
Estos son buenos si vas a utilizar SIGINT
menudo. Es posible que desee agregar controladores para TERM
y HUP
también.
Experiencia interesante (y buena solución para las próximas semanas):
Si está en Ubuntu y usa Guake para un acceso rápido a la terminal, puede iniciar
rails s
ahí. Ctrl + C funciona de manera reproducible para mí y detiene el servidor.
Espero poder ayudar! :)
EDITAR: Como obviamente esto no es reproducible para todos, aquí está mi configuración: Ubuntu 11.04, 32 bits, Guake 0.4.2-4ubuntu1
Me encontré con este problema yo mismo. Estoy usando rvm rails 3.0.9 y ubuntu 11.04 32bit running unity. Descubrí que terminator pasará Ctrl + c a los rieles.
Mi última respuesta fue eliminada. No sé por qué, pero vuelvo a intentarlo porque realmente creo que esto está muy relacionado con el problema.
En mi Gemfile tengo solo una gema que está usando el argumento: git.
gem ''rails_admin'', :git => ''git://github.com/sferik/rails_admin.git''
Tengo el mismo problema para todos ustedes, ctrl + C es ignorado; pero si elimino esta dependencia de gema (y elimino el inicializador relacionado) el problema desapareció y puedo usar ctrl + c como antes.
Podría pensar que es un error relacionado con la gema rails_admin, pero cuando leí en esta otra pregunta: CTRL + C al servidor Webbrick ignorado es más probable que esté relacionado con cualquier gema en la que se usa el parámetro: git ...
Espero que sea útil.
Ok, el problema se resolvió para mí. Una actualización reciente del kernel, que apliqué como parte de las actualizaciones estándar de Ubuntu, solucionó el problema.
Además, aquí hay una buena discusión del problema, que explica que la causa raíz fue una regresión del núcleo introducida en 2.6.38 ( http://redmine.ruby-lang.org/issues/4777 )
La regresión fue parcheada, y parece que el parche recientemente se incluyó en las actualizaciones de Ubuntu, por lo que si está siendo afectado por este problema, debe aplicar las últimas actualizaciones.
Parece ser un problema con Unity y Terminal. El ^ c no se procesa correctamente por algún motivo. intente hacer lo mismo usando terminator
(una mejor terminal). O simplemente usa gnome.
Al menos así es como resolví el problema. Propongo que cambiemos esto a askubuntu.com.
En U10.04 tuve este problema ejecutando webrick, mongrel, console, sqlite, no importaba lo que ejecutara realmente.
Prefiero comentar que agregar una respuesta para esto, pero no suficiente rep.
Tengo el mismo problema y descubrí que reanudar (con fg
) después de escribir ctrl - c y luego pausar (con ctrl - z , como se ofrece arriba) hace el truco.
Entonces la receta es:
- ctrl - c (no hace nada de inmediato)
- ctrl - z (pausa WEBrick, regresa al shell)
fg
(reanuda WEBrick, sigue inmediatamente con SIGINT)lampadmin@lampadmin-DX4840:/var/www/rails/agences$ r s => Booting WEBrick => Rails 3.0.5 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2011-05-14 14:25:36] INFO WEBrick 1.3.1 [2011-05-14 14:25:36] INFO ruby 1.9.2 (2011-02-18) [x86_64-linux] [2011-05-14 14:25:36] INFO WEBrick::HTTPServer#start: pid=2585 port=3000
^ C ^ Z (<- ctrl-c, luego ctrl-z)
[1]+ Stopped rails s lampadmin@lampadmin-DX4840:/var/www/rails/agences$ fg rails s [2011-05-14 14:25:45] INFO going to shutdown ... [2011-05-14 14:25:45] INFO WEBrick::HTTPServer#start done. Exiting
Si ctr + c no funciona, entonces antes de implementar los métodos mencionados, simplemente vea la configuración de su terminal. A veces puede suceder que cambiemos las teclas de acceso directo de la terminal según nuestra conveniencia. Y asignamos ctr + c para copiar contenido de la terminal. En este caso, ctr + c no funcionará para detener el servidor, sino que se usará como copia.
Si la configuración no se cambia, intente usar otro puerto como 4000.
Tengo un problema similar, he usado Ctrl + Z para pausar el trabajo, luego kill -9 %1
para matar el primer trabajo en pausa. Una forma indirecta de matarlo, pero funciona.
Consulte esta pregunta en Superusuario para obtener más información: https://superuser.com/questions/243460/what-to-do-when-ctrl-c-cant-kill-a-process
Tuve el mismo problema al actualizar mi Ubuntu. Imposible salir normalmente, usamos Ctrl + C , tuvimos que usar kill -9
...
usó esta línea para crear atajos con ccsm (compiz administrador de configuraciones conig o smth así) -> comandos:
kill -9 `pgrep -fl ''script/rails s'' | awk ''{print $1}''`
set to (ctrl + shift + `) o cualquier cosa que te guste