0

/etc/init.d/ にあるさまざまなデーモン スクリプトを見ても、'lockfile' 変数の目的が理解できないようです。デーモンを開始する前に「lockfile」変数がチェックされていないようです。

たとえば、/etc/init.d/ntpd の一部のコード:

prog=ntpd
lockfile=/var/lock/subsys/$prog

start() {
        [ "$EUID" != "0" ] && exit 4
        [ "$NETWORKING" = "no" ] && exit 1
        [ -x /usr/sbin/ntpd ] || exit 5
        [ -f /etc/sysconfig/ntpd ] || exit 6
        . /etc/sysconfig/ntpd

        # Start daemons.
        echo -n $"Starting $prog: "
        daemon $prog $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

「lockfile」変数は何をしていますか?

また、C++ で独自のデーモンを作成する場合 ( http://www.itp.uzh.ch/~dpotter/howto/daemonizeの下部にある例に従うなど)、コンパイルされたバイナリを /etc/ に直接配置しますか? init.d/ または、バイナリを呼び出すスクリプトをそこに配置しますか。(つまり、上記のコードの「daemon $prog」をバイナリへの呼び出しに置き換えますか?)

4

3 に答える 3

2

全体は、特定のデーモンが実行されているかどうかを追跡して、後でシャットダウンするかどうか/方法を知るための非常に脆弱で見当違いの試みです。pid を使用しても役に立ちません。プロセスの直接の親以外のプロセスにとって pid は無意味だからです。他の使用には、解決不可能で危険な競合状態があります (つまり、別の無関係なプロセスを強制終了する可能性があります)。残念ながら、この種の不適切に設計された (またはむしろ設計されていない) ハッカーは、ほとんどの UNIX システムで標準的な方法です...

問題を正しく解決するには、いくつかの方法があります。1つはsystemdアプローチですが、 「肥大化」し、最初の起動後にマウントされsystemdたリモートを使用するのが難しくなるため、一部のサークルの間で嫌われています。/usrいずれにせよ、ソリューションには次のいずれかが含まれます。

  1. すべてのデーモンを直接の子として生成する (つまり、個々のデーモン内で「デーモン化」を禁止する) マスター プロセスの使用。これにより、pid を使用して、デーモンの終了を監視し、ステータスを追跡し、必要に応じて強制終了できます。
  2. すべてのデーモンが、それ以外の場合は役に立たないファイル記述子を継承するように調整します。これは、プロセス終了の一部としてのみ開いたままにし、アトミックに閉じます。パイプ (匿名または名前付き fifo)、ソケット、さらには通常のファイルもすべて可能ですが、「もう一方の端」が閉じられるとすぐに EOF を与えるファイル タイプが最も適しています。通常のファイルでは、リンク カウント (からstat) を使用できますが、ポーリングを繰り返さずに待機する方法はありません。

いずれにせよ、lockfile/pidfile アプローチは醜く、エラーが発生しやすく、単純なような怠惰なアプローチよりも優れているとは言えませんkillall foobard(もちろん、これも間違っています)。

于 2011-10-01T16:27:36.880 に答える
1

「lockfile」変数は何をしていますか?

それは何もないかもしれませんし、例えばかもしれません。$OPTIONSこの行によって注入されます

   . /etc/sysconfig/ntpd

デーモンは、どこに行くこと-p pidfile$lockfileできるかというオプションを取ります。$PIDデーモンは、このファイルに書き込みます。

コンパイルされたバイナリを /etc/init.d/ に直接配置しますか、それともバイナリを呼び出すスクリプトをそこに配置しますか?

後者。にはバイナリがあってはならず、構成変更のためにスクリプト/etcを編集するのが通例です。/etc/init.dバイナリは/(s)binまたはに移動する必要があり/usr/(s)binます。

于 2011-10-01T15:55:40.143 に答える
1

rc スクリプトは、実行中かどうかを追跡し、実行していないものを停止する必要はありません。

于 2011-10-01T15:41:16.307 に答える