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
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
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
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é.
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.
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)
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>
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]
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:
cat tmp/pids/server.pid
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.
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.
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
one-liner: kill -INT `ps -e | grep Ruby | awk '{print $ 1}' '
ps -e
répertorie tous les processus du systèmegrep Ruby
recherche cette sortie pour le processus Rubyawk
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.
si le processus de suppression ne fonctionne pas, supprimez le fichier server.pid de MyRailsApp/tmp/pids /
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) ...
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)