Ich führe meine Rails-Anwendung wie folgt aus
$script/server -d webrick
Führen Sie auf meinem Ubuntu-System mit dem obigen Befehl den Webrick-Server im Hintergrund aus. Ich könnte den Prozess mit dem Befehl kill beenden
$kill pid
Bietet Rails einen Befehl zum Stoppen des Hintergrunds, auf dem der Daemon-Server ausgeführt wird?
Wie die, die von Rails zum Starten des Servers bereitgestellt wird. Danke.
BEARBEITEN Wann ist es angebracht, den Daemon-Server zu starten? Jedes Echtzeitszenario hilft Danke
ruby-on-rails
ubuntu
Srinivas MV
quelle
quelle
kill -9
nur dann , wenn der Dämon hing. Andernfalls verlieren Sie Ihre nicht gelöschten Daten aus Active Directory-Caches.Wenn es nützlich sein kann, können Sie unter Linux herausfinden, welcher Prozess einen Port verwendet (in diesem Fall 3000), den Sie verwenden können:
es wird auch die PID zurückgeben
quelle
lsof -i :3000
sagt mir die PID des laufenden Rubinskill $(lsof -i :3000 -t)
- Die Option -t steht für knapp, was bedeutet, dass nur die Prozess-ID ausgegeben wird.alias stopRails='kill -9 $(lsof -i :3000 -t)'
mitalias startRails='rails server -d'
(wird fehlschlagen, wenn Sie nicht in Ihrem App-Verzeichnis sind, aber das ist in Ordnung) und schließlichalias restartRails='stopRails && startRails'
pid = `lsof -i :3000 -t`.chomp.to_i
(@Gerry wirklich netter Anruf auf der-t
Flagge, ich habe heute etwas Neues gelernt!)Wie Ryan sagte:
wahrscheinlich ist server.pid die gewünschte Datei.
Sie sollten in der Lage sein,
kill -9 $(cat tmp/pids/server.pid)
einen daemonisierten Server herunterzufahren.quelle
lsof -i :3000
ich die PID von Rubin erhalten habe, dannkill -9 1406orWhateverThePIDofRubyWas
- easypeasy - Danke!Die Prozess-ID des Daemon-Servers wird in Ihrem Anwendungsverzeichnis tmp / pids / gespeichert. Sie können Ihren Standard
kill process_id
mit den Informationen verwenden, die Sie dort finden.quelle
kill -9 $(lsof -i:3000) &> /dev/null
. Der&>
nachfolgende Teil ist optional - er unterdrückt nur einige Ausgaben des Befehls kill.Der einzig richtige Weg, um den Ruby on Rails-Standardserver (WEBrick) zu beenden, ist:
kill -INT $(cat tmp/pids/server.pid)
Wenn Sie Mongrel ausführen, ist dies ausreichend:
kill $(cat tmp/pids/server.pid)
Verwenden
kill -9
Sie diese Option, wenn Ihr Daemon hängt. Denken Sie an die Auswirkungen vonkill -9
: Wenn die in Active Record-Caches gespeicherten Daten nicht auf die Festplatte geschrieben wurden, gehen Ihre Daten verloren. (Wie ich es kürzlich getan habe)quelle
In Ihrem Terminal, um die Prozess-ID (PID) herauszufinden:
$ lsof -wni tcp:3000
Verwenden Sie dann die Nummer in der PID-Spalte, um den Prozess abzubrechen:
$ kill -9 <PID>
quelle
pguardiario hat mich geschlagen, obwohl seine Implementierung ein bisschen gefährlich ist, da sie
SIGKILL
anstelle der (empfohlenen) verwendetSIGINT
. Hier ist eine Rechenaufgabe, die ich in meine Entwicklungsprojekte importiere:lib / task / 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
Dies führt nur dann zu einer Unterbrechung des Servers, wenn die PID-Datei vorhanden ist. Es werden keine unschönen Fehler ausgegeben, wenn der Server nicht ausgeführt wird, und es benachrichtigt Sie, wenn der Server tatsächlich heruntergefahren wird.
Wenn Sie feststellen, dass der Server mit dieser Aufgabe nicht heruntergefahren werden soll, fügen Sie nach der
Process.kill "INT"
Zeile die folgende Zeile hinzu und versuchen Sie, ein Upgrade auf einen Kernel durchzuführen, bei dem dieser Fehler behoben ist.Process.kill "CONT", pid
( Hutspitze : Jackr )
quelle
Führen Sie diesen Befehl aus:
locate tmp/pids/server.pid
Ausgabe: Vollständiger Pfad dieser Datei. Überprüfen Sie den Namen Ihres Projektverzeichnisses, um Ihre betroffene Datei zu finden, wenn mehrere Dateien in der Liste angezeigt werden.
Führen Sie dann diesen Befehl aus:
rm -rf [complete path of tmp/pids/server.pid file]
quelle
x=`locate tmp/pids/server.pid` && kill `cat ${x}`
Ein Ruby-Ticket, http://bugs.ruby-lang.org/issues/4777 , deutet darauf hin, dass es sich um einen Kernel-Fehler (Linux) handelt. Sie bieten eine Problemumgehung (im Wesentlichen gleichbedeutend mit Strg-C / Strg-Z), die Sie verwenden können, wenn Sie den Server verteufelt haben:
cat tmp/pids/server.pid
cat tmp/pids/server.pid
Dies scheint dazu zu führen, dass das ursprüngliche INT-Signal verarbeitet wird, was möglicherweise ein Löschen der Daten usw. ermöglicht.
quelle
Hier hinterlasse ich eine Bash-Funktion, die, wenn sie in Sie eingefügt wird
.bashrc
oder.zshrc
legiert, Dinge wie: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
Hier ist es die Funktion:
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; }
Weitere Informationen in dem Blog-Beitrag, den ich darüber geschrieben habe.
quelle
Ich glaube nicht, dass es funktioniert, wenn Sie -d verwenden. Ich würde den Prozess einfach beenden.
Öffnen Sie in Zukunft stattdessen einfach ein anderes Terminalfenster und verwenden Sie den Befehl ohne -d. Er bietet einige wirklich nützliche Debugging-Ausgaben.
Wenn es sich um eine Produktion handelt, verwenden Sie beispielsweise Passagier oder Thin, damit die Prozesse leicht gestoppt oder die Server neu gestartet werden können
quelle
ps -e
listet jeden Prozess auf dem System auf, dergrep ruby
sucht, dass die Ausgabe für den Ruby-Prozessawk
das erste Argument dieser Ausgabe (die PID) an übergibtkill -INT
.Versuchen Sie es mit Echo statt Kill, wenn Sie nur die PID sehen möchten.
quelle
Wenn der Kill-Prozess nicht funktioniert, löschen Sie die Datei server.pid aus MyRailsApp / tmp / pids /
quelle
Ich bin hierher gekommen, weil ich (erfolglos) versucht habe, mit einem normalen Kill aufzuhören, und dachte, ich würde etwas falsch machen.
Ein Kill -9 ist der einzig sichere Weg, um einen Ruby on Rails-Server zu stoppen? Was!? Kennen Sie die Auswirkungen davon? Kann eine Katastrophe sein ...
quelle
Sie können Ihren Server im Hintergrund starten, indem Sie ihn
-d
zu Ihrem Befehl hinzufügen . Zum Beispiel:Um es zu stoppen, beenden Sie einfach den Prozess, der auf Port 3000 ausgeführt wird:
kill $(cat tmp/pids/server.pid)
quelle