2010-12-17 4 views
2

私は自分のレールアプリでいくつかのバックグラウンドプロセスを実行するためにdelayed_jobを使用しています。これらのプロセスは、DBへの読み書きとログファイルへの書き込みを行います。デーモンを停止するとデータが破損することがありますか?

私の仕事は止まってしまいますが、それはプロセスを殺してしまいますか(データが壊れてしまう可能性があります)、それとも仕事が終了するのを待っているのでしょうか?

答えて

2

あなたのコードをどのように書いているかによって異なります。

通常、ジョブを強制終了すると、コード上のプラグが急に動き、すぐに停止します。それは書き込みの途中であったり、バッファがフラッシュされたり、ファイルが正常に閉じられたりする前の状態である可能性があります。

タスクを完了しなければならない場合は、信号をトラップできます。コードはシグナルを無視して実行を継続することができますが、これは最適な解決策ではありません。また、正常なシャットダウン、バッファのフラッシュ、DB接続のクローズ、ファイルのクローズなどを開始して終了することもできます。

そして、信号を無視する理由は良くありません。システムがシャットダウンまたは再起動する前に、シャットダウンするようにOSから通知されるものがあります。閉じることのないアプリは、ユーザーやシステム管理者を怒らせる可能性があります。ユーザーはシステムを終了させる方法を見つけるでしょう。

詳細はSignalをご覧ください。

+1

「すべて」または「すべて」を「トランザクション」と解釈するようにジョブを設計すると、これをうまく回避することができます。 – hurikhan77

+0

@ hurican:killされたデーモンがトランザクションをサポートしていなかった場合、クライアントソフトを「trasactional」にしても役に立たない。したがって、彼のDBがトランザクションをサポートするかどうかという疑問があります。 –

関連する問題