0

私はProc::Daemon開始/停止デーモンスクリプトを作成しようとして使用してきましたが、何かを行うことができます:

X start
X stop
X status

など。ただし、ソース コードではProc::Daemon、「pid」ファイルまたはプロセス テーブルの検索のいずれかを使用しているように見えます。私はこれらのアプローチの両方に関心があります.1つ目は「pid」が再利用されるため、サービスが実際にダウンしているときにサービスが稼働しているという印象を与える可能性があること、2つ目はプロセステーブルのエントリが簡単に偽造され、チェックが見えないことです.特に堅牢。

私が説明したような起動/停止デーモンスクリプト/プログラムを作成する堅牢な方法はありますか、または誰かがすでに作成していますか? 私は root アクセス権を持っていないことに注意してください。重要な場合は、私も Solaris を使用しています。

4

2 に答える 2

2

pidは再利用されますが、(大きな)固定サイズのセットをラウンドロビンするものと思います。たとえば、Solarisでは、これは30,000でした(現在は異なる場合があります)。したがって、pidを再利用する前に、30,000のプロセスを開始/終了する必要があります。

Proc :: Daemonが使用するアプローチは不合理に見えず、この問題に対するかなり一般的なアプローチです。

于 2012-11-21T13:55:02.680 に答える
1

私が使用するアプローチは、デーモンプロセスにファイルの排他(書き込み)ロックを取得させることです。

自分でロックを取得しようとすることで、誰かがロックを保持しているかどうかをテストできます。ファイルのロックを保持しているプロセスのPIDを取得するには、さまざまな方法があります。つまり、fcntlや/proc内の何かです。

アドバイスのいくつかの言葉:

  1. ロックにはローカルファイル(つまり、NFSではない)を使用します。
  2. デーモンを起動する前に、ロックファイルが存在することを確認してください。
  3. ロックファイルは絶対に削除しないでください。

カーネルはロックをファイルのiノード番号に関連付けるため、ロックファイルには常に同じiノード番号が必要です。ロックファイルを削除して再作成すると、ロックに関連付けられているiノードが変更されます。

単純なキープアライブメカニズムをcronジョブとして実装できます。cronジョブはN分ごとにデーモンプロセスを生成しようとし、排他ロックを取得できない場合はデーモンを静かに終了させます。

于 2012-11-21T15:06:51.110 に答える