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:
- matar -INT
cat tmp/pids/server.pid
- 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.