usar rails que online learn instalar how guias empezar curso con como ruby-on-rails ubuntu

ruby on rails - que - ¿Cómo detener un Servidor Daemon en Rails?



ruby on rails guias (14)

Estoy ejecutando mi aplicación de rieles utilizando la siguiente

$script/server -d webrick

en mi sistema Ubuntu, el comando anterior ejecuta el servidor webrick en segundo plano. Podría matar el proceso usando el comando kill

$kill pid

¿Los rieles proporcionan algún comando para detener el fondo que ejecuta el servidor daemon?

como el proporcionado por los rieles para iniciar el servidor, gracias.

EDITAR ¿ Cuándo es apropiado iniciar el servidor daemon? Cualquier escenario en tiempo real ayudará Gracias


¿Qué tal una tarea de rake?

desc ''stop rails'' task :stop do pid_file = ''tmp/pids/server.pid'' pid = File.read(pid_file).to_i Process.kill 9, pid File.delete pid_file end

correr con parada de rake o sudo rake stop


Aquí dejo una función bash que, si está pegada en usted .bashrc o .zshrc lo .zshrc a hacer cosas como:

rails start # To start the server in development environment rails start production # To start the server in production environment rails stop # To stop the server rails stop -9 # To stop the server sending -9 kill signal rails restart # To restart the server in development environment rails restart production # To restart the server in production environment rails whatever # Will send the call to original rails command

Aquí está la función:

function rails() { if [ "$1" = "start" ]; then if [ "$2" = "" ]; then RENV="development" else RENV="$2" fi rails server -d -e "$RENV" return 0 elif [ "$1" = "stop" ]; then if [ -f tmp/pids/server.pid ]; then kill $2 $(cat tmp/pids/server.pid) return 0 else echo "It seems there is no server running or you are not in a rails project root directory" return 1 fi elif [ "$1" = "restart" ]; then rails stop && rails start $2 else command rails $@ fi; }

Más información en la publicación del blog que escribí al respecto.


Como Ryan dijo:

el pid que quiere está en tmp / pids /

probablemente server.pid es el archivo que desea.

Deberías poder ejecutar kill -9 $(cat tmp/pids/server.pid) para derribar un servidor daemonizado.


En su terminal para averiguar el ID del proceso (PID):

$ lsof -wni tcp:3000

Luego, use el número en la columna PID para matar el proceso:

$ kill -9 <PID>


La única forma correcta de eliminar el servidor predeterminado de Ruby on Rails (que es WEBrick) es:

kill -INT $(cat tmp/pids/server.pid)

Si está ejecutando Mongrel, esto es suficiente:

kill $(cat tmp/pids/server.pid)

Usa kill -9 si tu daemon colgaba. Recuerde las implicaciones de kill -9 : si los datos almacenados en los cachés de Active Record no se enjuagaron en el disco, perderá sus datos. (Como lo hice recientemente)


La identificación del proceso del servidor daemon se almacena en su directorio de aplicaciones tmp / pids /. Puedes usar tu kill process_id estándar con la información que encuentres allí.


Un boleto de Ruby, http://bugs.ruby-lang.org/issues/4777 , sugiere que es un error del kernel (Linux). Dan una vuelta (esencialmente equivalente al Ctrl-C / Ctrl-Z uno), para usar si demonizaron el servidor:

  1. matar -INT cat tmp/pids/server.pid
  2. matar -CONT cat tmp/pids/server.pid

Esto parece causar que la señal INT original sea procesada, posiblemente permitiendo que los datos se vayan y así sucesivamente.


Vine aquí porque estaba intentando (sin éxito) parar con una muerte normal, y pensé que estaría haciendo algo mal.

¿Un kill -9 es la única forma segura de detener un servidor de ruby ​​on rails? ¿¡Qué!? ¿Conoces las implicaciones de esto? Puede ser un desastre ...


no creo que sí si usas -d. Yo solo mataría el proceso.

En el futuro, simplemente abre otra ventana de terminal y usa el comando sin -d, proporciona una salida de depuración realmente útil.

Si esto es producción, use algo como pasajero o delgado, para que sea fácil detener los procesos o reiniciar los servidores


si kill pid no funciona, entonces elimine el archivo server.pid en MyRailsApp / tmp / pids /


si puede ser útil, en Linux puede encontrar qué proceso está usando un puerto (en este caso 3000) que puede usar:

lsof -i: 3000

devolverá el pid también


Ejecute este comando:

locate tmp/pids/server.pid

salida: ruta completa de este archivo. Verifique el nombre de su directorio de proyecto para encontrar su archivo en cuestión si se muestran varios archivos en la lista.

Luego ejecuta este comando:

rm -rf [complete path of tmp/pids/server.pid file]


pguardiario me ganó, aunque su implementación es un poco peligrosa ya que usa SIGKILL lugar del SIGINT (recomendado). Aquí hay una tarea de rake que tiendo a importar a mis proyectos de desarrollo:

lib / tasks / stopserver.rake

desc ''stop server'' task :stopserver do pid_file = ''tmp/pids/server.pid'' if File.file?(pid_file) print "Shutting down WEBrick/n" pid = File.read(pid_file).to_i Process.kill "INT", pid end File.file?(pid_file) && File.delete(pid_file) end

Esto emite una interrupción al servidor si y solo si existe el archivo pid. No arroja errores desagradables si el servidor no se está ejecutando, y le avisa si realmente está cerrando el servidor.

Si nota que el servidor no desea cerrar utilizando esta tarea, agregue la siguiente línea después de la línea Process.kill "INT" , e intente actualizar a un kernel que tiene este error corregido.

Process.kill "CONT", pid

(Punta de sombrero: jackr )


one-liner: kill -INT `ps -e | grep ruby | awk ''{print $1}''`

ps -e enumera cada proceso en el sistema
grep ruby busca esa salida para el proceso ruby
awk pasa el primer argumento de esa salida (el pid) para kill -INT .


Pruébalo con eco en lugar de matar si solo quieres ver el PID.