次を使用してRailsアプリケーションを実行しています
$script/server -d webrick
私のUbuntuシステムでは、上記のコマンドはバックグラウンドでwebrickサーバーを実行します。 killコマンドを使用してプロセスを強制終了できます
$kill pid
Railsは、デーモンサーバーを実行しているバックグラウンドを停止するコマンドを提供しますか?
Railsによって提供されるもののように、サーバーを起動するにはThanks。
[〜#〜] edit [〜#〜]デーモンサーバーを起動するのが適切な場合リアルタイムシナリオはすべて、Thanksに役立ちます
レーキタスクはどうですか?
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
rake stopまたはSudo rake stopで実行します
役に立つ場合は、Linuxでポート(この場合は3000)を使用しているプロセスを見つけることができます。
lsof -i:3000
pidも返されます
ライアンが言ったように:
必要なpidはtmp/pids /にあります
おそらく、server.pidが必要なファイルです。
kill -9 $(cat tmp/pids/server.pid)
を実行して、デーモン化されたサーバーを停止できるはずです。
デーモンサーバーのプロセスIDは、アプリケーションディレクトリtmp/pids /に保存されます。標準のkill process_id
をそこにある情報で使用できます。
唯一のproper Ruby on Railsデフォルトサーバー(WEBrick))を殺す方法は:
kill -INT $(cat tmp/pids/server.pid)
Mongrelを実行している場合、これで十分です。
kill $(cat tmp/pids/server.pid)
デーモンがハングした場合は、kill -9
を使用します。 kill -9
の意味を覚えておいてください-Active Recordのキャッシュに保存されているデータがディスクにフラッシュされなかった場合、データが失われます。 (最近やったように)
端末でプロセスID(PID)を確認します。
$ lsof -wni tcp:3000
次に、PID列の番号を使用してプロセスを強制終了します。
$ kill -9 <PID>
このコマンドを実行:
locate tmp/pids/server.pid
出力:このファイルの完全なパス。リストに複数のファイルが表示されている場合は、プロジェクトディレクトリ名を確認して、問題のファイルを見つけます。
次に、次のコマンドを実行します。
rm -rf [complete path of tmp/pids/server.pid file]
pguardiario それにbeatられますが、彼の実装は(推奨)SIGKILL
の代わりにSIGINT
を使用するため、少し危険です。開発プロジェクトにインポートする傾向のあるレーキタスクを次に示します。
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
これは、pidfileが存在する場合にのみ、サーバーに割り込みを発行します。サーバーが実行されていなくても見苦しいエラーはスローされず、実際にサーバーをシャットダウンしている場合は通知されます。
サーバーがこのタスクを使用してシャットダウンしたくないことに気づいた場合、Process.kill "INT"
行の後に次の行を追加し、このバグが修正されたカーネルにアップグレードしてみてください。
Process.kill "CONT", pid
(ハットチップ: ジャッカー )
Rubyチケット、 http://bugs.Ruby-lang.org/issues/4777 は、カーネル(Linux)バグであることを示唆しています。 (基本的にCtrl-C/Ctrl-Zに相当)、サーバーを悪魔化した場合に使用:
cat tmp/pids/server.pid
cat tmp/pids/server.pid
これにより、元のINT信号が処理され、データのフラッシュなどが可能になる可能性があります。
ここに、bash関数を残します。これは、あなたに貼り付ける場合は.bashrc
または.zshrc
は次のようなことを行います。
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
ここに関数があります:
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;
}
ブログ投稿 で詳細を書きました。
-dを使用した場合、そうなるとは思わない。プロセスを強制終了します。
将来的には、代わりに別のターミナルウィンドウを開き、-dなしでコマンドを使用するだけで、非常に便利なデバッグ出力が提供されます。
これが本番の場合、乗客やシンなどを使用して、プロセスの停止やサーバーの再起動を簡単にします。
one-liner:kill -INT `ps -e | grep Ruby | awk '{print $ 1}' `
ps -e
はシステム上のすべてのプロセスをリストしますgrep Ruby
は、Rubyプロセスの出力を検索しますawk
は、その出力の最初の引数(pid)をkill -INT
に渡します。
PIDを表示するだけの場合は、killではなくechoで試してください。
強制終了プロセスが機能しない場合は、MyRailsApp/tmp/pids /からファイルserver.pidを削除します
私がここに来たのは、私が(失敗して)通常の殺人で止めようとしていて、何か間違ったことをしていると思ったからです。
Kill -9は、Ruby on Railsサーバー?何!?これの意味を知っていますか?災害になる可能性がありますか? ...
コマンドに-d
を追加することにより、サーバーをバックグラウンドで起動できます。例えば:
puma -d
停止するには、ポート3000で実行されているプロセスを強制終了します。
kill $(cat tmp/pids/server.pid)