19

私の RubyOnRails-App では、Capistrano のデプロイの最後にバックグラウンド ジョブを開始する必要があります。このために、 deploy.rb で次のことを試しました。

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true

これでうまくいくこともありますが、ほとんどの場合、プロセスは開始されません (= ps -aux にリストされていません)。そして、エラーメッセージはありません。また、ホームディレクトリにもレールアプリディレクトリにもnohup.outはありません。

scheduler.rb で nohup の代わりに trap('SIGHUP', 'IGNORE') を使用してみましたが、結果は同じです。

それを機能させる唯一の方法は、「:pty => true」を削除し、「cap deploy」の最後で手動で Ctrl-C を実行することです。でもこれは好きじゃない…

この Scheduler.start を呼び出す他の機会はありますか? または、さらにエラー メッセージを取得するには?

サーバーでRails 2.3.2、Capistrano 2.5.8、Ubuntu Hardyを使用しています

4

4 に答える 4

17

:pty => true を指定すると、ユーザー シェルの起動スクリプト (bashrc など) は (通常) 読み込まれません。依存する環境変数がないため、私の Ruby プログラムは起動直後に終了しました。

:pty => true がないと、質問で説明したように、プロセスが終了するのを待ってカピストラーノがハングします。すぐに戻るようにするには、stdout と stderr の両方をリダイレクトする必要があります。

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good.

バックグラウンド タスクがまだ実行されない場合。出力を調査できるように、stdout と stderr をログ ファイルにリダイレクトしてみてください。

于 2011-04-29T07:19:30.897 に答える
1

スケジューラ ジョブをバックグラウンドで継続的に実行し、Capistrano の実行時に再起動しますか?

もしそうなら、そのためにrunit http://smarden.sunsite.dk/runit/とDelayedJob http://github.com/Shopify/delayed_job/tree/masterを使用します

  1. init を置き換えないモードで runit をインストールする
  2. バックグラウンド ジョブを runit サービスとして追加し、そのためのログ モニターを runit から追加します。
  3. カピストラーノに sudo sv kill job_name を呼び出して、ジョブを強制終了して再起動させます。

私のバックラウンド ジョブは、バックグラウンド Rails タスクを処理する Rails プラグイン DelayedJob のインスタンスです。Capistrano をデプロイするたびに強制終了して、更新されたコード ベースで再起動します。

これは非常に信頼できることが証明されています。

HTH、

ラリー

于 2009-07-10T13:48:44.473 に答える
1

このタスク スケジューラに -d スイッチがあれば、機能します。たとえば、パッセンジャー スタンドアロンには、デーモン化されたプロセスとして起動する -d オプションがあります。

namespace :passenger_standalone do
  task :start do
    run "cd #{current_path} && passenger start -e #{rails_env} -d"
  end
  task :stop do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop"
  end
  task :restart do
    stop
    start
  end
end
于 2012-02-27T19:53:57.257 に答える