web-dev-qa-db-fra.com

Comment arrêter un serveur démon dans Rails?

J'exécute mon Rails application en utilisant ce qui suit

  $script/server -d webrick 

sur mon système Ubuntu, la commande ci-dessus exécute le serveur webrick en arrière-plan. Je pourrais tuer le processus en utilisant la commande kill

  $kill pid

Rails fournit-il une commande pour arrêter le serveur démon en arrière-plan?

comme celui fourni par Rails pour démarrer le serveur, merci.

MODIFIER Quand est-il approprié de démarrer le serveur démon? Tout scénario en temps réel vous aidera Merci

75
Srinivas M.V.

Que diriez-vous d'une tâche de râteau?

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

courir avec rake stop ou Sudo rake stop

32
pguardiario

si cela peut être utile, sur linux, vous pouvez trouver quel processus utilise un port (dans ce cas 3000), vous pouvez utiliser:

lsof -i: 3000

ça rendra le pid aussi

81
magnum

Comme l'a dit Ryan:

le pid que vous voulez est en tmp/pids /

server.pid est probablement le fichier que vous voulez.

Vous devriez pouvoir exécuter kill -9 $(cat tmp/pids/server.pid) pour arrêter un serveur démonisé.

36
Douglas Meyer

L'ID de processus du serveur démon est stocké dans votre répertoire d'application tmp/pids /. Vous pouvez utiliser votre standard kill process_id avec les informations que vous y trouverez.

18
Ryan

Le seul bon moyen de tuer le Ruby on Rails serveur par défaut (qui est WEBrick)) est:

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

Si vous exécutez Mongrel, cela suffit:

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

Utilisation kill -9 si votre démon se bloquait. N'oubliez pas les implications de kill -9 - si les données conservées dans les caches Active Record n'ont pas été vidées sur le disque, vous perdrez vos données. (Comme je l'ai fait récemment)

16
Nowaker

Dans votre terminal pour connaître l'ID de processus (PID):

$ lsof -wni tcp:3000

Ensuite, utilisez le numéro dans la colonne PID pour tuer le processus:

$ kill -9 <PID>
14
Ramiz Raja

Exécutez cette commande:

locate tmp/pids/server.pid

sortie: Chemin complet de ce fichier. Vérifiez le nom de votre répertoire de projet pour trouver votre fichier concerné si plusieurs fichiers sont affichés dans la liste.

Exécutez ensuite cette commande:

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

pguardiario m'a battu, bien que son implémentation soit un peu dangereuse car elle utilise SIGKILL au lieu du (recommandé) SIGINT. Voici une tâche de rake que j'ai tendance à importer dans mes projets de développement:

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

Cela émet une interruption sur le serveur si et seulement si le fichier pid existe. Il ne génère pas d'erreurs disgracieuses si le serveur n'est pas en cours d'exécution et il vous avertit s'il ferme réellement le serveur.

Si vous remarquez que le serveur ne souhaite pas s'arrêter à l'aide de cette tâche, ajoutez la ligne suivante après le Process.kill "INT" line, et essayez de passer à un noyau qui a ce bug corrigé.

Process.kill "CONT", pid

(Astuce chapeau: jackr )

Un Ruby, http://bugs.Ruby-lang.org/issues/4777 , suggère qu'il s'agit d'un bogue du noyau (Linux). Ils donnent une solution (essentiellement équivalent à celui Ctrl-C/Ctrl-Z), à utiliser si vous avez diabolisé le serveur:

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

Cela semble entraîner le traitement du signal INT d'origine, ce qui peut permettre le vidage des données, etc.

5
jackr

Ici, je laisse une fonction bash qui, si elle est collée en vous .bashrc ou .zshrc vous alliera faire des choses comme:

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

Voici la fonction:

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;
}

Plus d'informations dans le article de blog J'ai écrit à ce sujet.

4

je ne pense pas que ce soit le cas si vous utilisez -d. Je tuerais juste le processus.

À l'avenir, ouvrez simplement une autre fenêtre de terminal à la place et utilisez la commande sans -d, elle fournit une sortie de débogage vraiment utile.

S'il s'agit de production, utilisez quelque chose comme passager ou léger, afin qu'ils soient faciles à arrêter les processus ou à redémarrer les serveurs

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

ps -e répertorie tous les processus du système
grep Ruby recherche cette sortie pour le processus Ruby
awk passe le premier argument de cette sortie (le pid) à kill -INT.


Essayez-le avec écho au lieu de tuer si vous voulez simplement voir le PID.

3
billrichards

si le processus de suppression ne fonctionne pas, supprimez le fichier server.pid de MyRailsApp/tmp/pids /

2
SunTechnique

Je suis venu ici parce que j'essayais (sans succès) d'arrêter avec une mise à mort normale, et je pensais que je faisais quelque chose de mal.

Un kill -9 est le seul moyen sûr d'arrêter un Ruby on Rails server? What !? Savez-vous les implications de ceci? Peut être un désastre) ...

1
FrameGrace

Vous pouvez démarrer votre serveur en arrière-plan en ajoutant -d à votre commande. Par exemple:

puma -d

Pour l'arrêter, il suffit de tuer le processus en cours d'exécution sur le port 3000:

kill $(cat tmp/pids/server.pid)
1
Flavio Wuensche