6

UDP 経由で特定の情報を別のコンピューターに送信する Linux デーモン (C 言語) を作成しました。もちろん、リモート IP アドレスとポート番号が必要です。このデーモンを保存し、デーモンを開始|停止|再起動する/usr/local/bin/スクリプトも作成しました。/etc/init.d/

これまでのところ、IP アドレスとポート番号は、スクリプトによって直接デーモンに渡されます。たとえば、スクリプトの start() 部分は次のようになります。

start() {
  /usr/local/bin/lvsload_udp_s 192.168.122.25 47239
}

そのため、リモート IP やポート番号が変更された場合、構成ファイルを変更するのではなく、スクリプトを変更する必要があります。それは悪い習慣です、私は知っています。

デーモンに引数を渡す最良の方法は何ですか? ありがとう

4

4 に答える 4

6

コマンドラインパラメータが悪いと思うのはなぜですか?

構成ファイルは、解析する必要があるため、追加の作業です。そして、あなたの例では、構成ファイルを変更する= 1つのファイルを変更します。スクリプトの変更 = 1 つのファイルの変更。少数の引数しかない場合、大きな違いはないようです。スクリプトの先頭にある変数にパラメーターを貼り付けることもできます。これにより、ほとんど構成ファイルのようになります:-) 一部のスクリプトは、そのような「変数設定スクリプト」をソースとして使用するため、実際には構成ファイルのように見えます。

コマンド ライン パラメーターが不適切な理由を見つけることができれば、代わりに何を使用すればよいかもわかる可能性が高くなります。一方、コマンド ライン パラメータが不適切な理由を説明することさえできない場合は、おそらくそれらを使用しても問題はありません...

于 2012-07-04T22:13:01.260 に答える
2

Q: これまでのところ、IP アドレスとポート番号はデーモンに直接渡されています... それは悪い習慣です。

A: なぜ「悪い習慣」だと思いますか????

「グッド プラクティス」には次のものが含まれます。

  • "DRY" (同じことを繰り返すな - データを 1 か所だけに保存​​する)

  • 「KISS」(Keep it Simple, Stupid)

1 つのスクリプト (init.d スタートアップ スクリプト) 内の 1 つのパラメーター (コマンド ライン IP アドレス) は、両方の原則にかなり準拠していると言えます :)

私見では...

PS:

構成ファイルが適切であると本当に考える場合 (起動時に解析する必要がある複雑な構成データが多数ある場合)、適切な場所は次の 2 つです。

  • 構成ファイルを /etc に保存します (およびアプリを /usr/local/bin に保存します)

    ... また ..

  • 構成ファイルをアプリのインストール ディレクトリに保存します (インストール ディレクトリを指すようにグローバル環境変数を定義することもできます)。

于 2012-07-04T22:08:27.030 に答える
2

これはディストリビューション固有です。たとえば、debian では、/etc/init.d/foo に「source /etc/default/foo」のような行が含まれるという規則があります。このファイルには、DAEMON_ARGS="--remote-ip=192.168.0.1" などの環境変数のみが含まれています。

debhelper を使用して debian パッケージをビルドすると、この構造が自動的に作成されます。「標準」RPM を作成するための同様のツールもあると思います。

于 2012-07-04T22:09:24.870 に答える
1

環境変数を使用します。

// include stdlib for getenv

port = getenv("MY_DAEMON_PORT");
host = getenv("MY_DAEMON_HOST");

// convert port to integer...

私が思い出したように、これは から起動されたプロセスではやや一般的init.dです。

Ubuntu を使用していると述べたので、ドキュメント/etc/environmentを参照してください。しかし、誰かがすでに述べたように、これはシステム/ディストリビューションに依存しています。別の方法は、環境変数をegに保持し、initスクリプトから次のようにソースすることです。/etc/myDaemon.env

. /etc/myDaemon.env

しかし、あなたのケースは非常に単純なので、スクリプトに引数を保持しても問題はありません。

于 2012-07-04T22:11:32.600 に答える