web-dev-qa-db-ja.com

Railsでデーモンサーバーを停止する方法は?

次を使用してRailsアプリケーションを実行しています

  $script/server -d webrick 

私のUbuntuシステムでは、上記のコマンドはバックグラウンドでwebrickサーバーを実行します。 killコマンドを使用してプロセスを強制終了できます

  $kill pid

Railsは、デーモンサーバーを実行しているバックグラウンドを停止するコマンドを提供しますか?

Railsによって提供されるもののように、サーバーを起動するにはThanks。

[〜#〜] edit [〜#〜]デーモンサーバーを起動するのが適切な場合リアルタイムシナリオはすべて、Thanksに役立ちます

75
Srinivas M.V.

レーキタスクはどうですか?

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で実行します

32
pguardiario

役に立つ場合は、Linuxでポート(この場合は3000)を使用しているプロセスを見つけることができます。

lsof -i:3000

pidも返されます

81
magnum

ライアンが言ったように:

必要なpidはtmp/pids /にあります

おそらく、server.pidが必要なファイルです。

kill -9 $(cat tmp/pids/server.pid)を実行して、デーモン化されたサーバーを停止できるはずです。

36
Douglas Meyer

デーモンサーバーのプロセスIDは、アプリケーションディレクトリtmp/pids /に保存されます。標準のkill process_idをそこにある情報で使用できます。

18
Ryan

唯一の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のキャッシュに保存されているデータがディスクにフラッシュされなかった場合、データが失われます。 (最近やったように)

16
Nowaker

端末でプロセスID(PID)を確認します。

$ lsof -wni tcp:3000

次に、PID列の番号を使用してプロセスを強制終了します。

$ kill -9 <PID>
14
Ramiz Raja

このコマンドを実行:

locate tmp/pids/server.pid

出力:このファイルの完全なパス。リストに複数のファイルが表示されている場合は、プロジェクトディレクトリ名を確認して、問題のファイルを見つけます。

次に、次のコマンドを実行します。

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

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に相当)、サーバーを悪魔化した場合に使用:

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

これにより、元のINT信号が処理され、データのフラッシュなどが可能になる可能性があります。

5
jackr

ここに、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;
}

ブログ投稿 で詳細を書きました。

4

-dを使用した場合、そうなるとは思わない。プロセスを強制終了します。

将来的には、代わりに別のターミナルウィンドウを開き、-dなしでコマンドを使用するだけで、非常に便利なデバッグ出力が提供されます。

これが本番の場合、乗客やシンなどを使用して、プロセスの停止やサーバーの再起動を簡単にします。

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

ps -eはシステム上のすべてのプロセスをリストします
grep Rubyは、Rubyプロセスの出力を検索します
awkは、その出力の最初の引数(pid)をkill -INTに渡します。


PIDを表示するだけの場合は、killではなくechoで試してください。

3
billrichards

強制終了プロセスが機能しない場合は、MyRailsApp/tmp/pids /からファイルserver.pidを削除します

2
SunTechnique

私がここに来たのは、私が(失敗して)通常の殺人で止めようとしていて、何か間違ったことをしていると思ったからです。

Kill -9は、Ruby on Railsサーバー?何!?これの意味を知っていますか?災害になる可能性がありますか? ...

1
FrameGrace

コマンドに-dを追加することにより、サーバーをバックグラウンドで起動できます。例えば:

puma -d

停止するには、ポート3000で実行されているプロセスを強制終了します。

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