
debconf
インストール中にUbuntu 16.04で構成パッケージを使用中に、次の問題が発生しました。
より正確には、このパッケージはdebconf
構成ファイルを保存してからpostinst
スクリプトからサービスを開始するために使用されます。さらに、サービスはdebconf
モジュールを使用して前の手順で保存した設定をロードします。
ただし、次のエラーによりサービスがsystemd
開始されません。
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
私が知っている限り、このファイルはdpkg
まだフロントエンドを使用してアクセスされており、debconf
サービスが別のフロントエンドを起動しようとすると競合が発生します(環境変数はDEBIAN_HAS_FRONTEND
サービスに渡されません)。DEBIAN_HAS_FRONTEND
スクリプトでenv変数を強制的に適用しようとしましたが、他のエラーが発生しました。
dpkg
プロセスが終了してdebconf
完了したら、デーモンを強制的に起動する必要があると思います。どんなアイデアがありますか?
答え1
それで、ついに問題を見つけて、後で誰かに役立つかどうかを投稿します。
前述のように、postinst
スクリプトでサービスを開始しようとしていますが、サービスがいくつかの構成パラメータを取得しようとしていますが、すでに実行中のインスタンスがあるため、debconfig
エラーが発生します(すべての構成がファイルにあるにもかかわらず)。 、ファイルではありません)。debconf
config
postinst
当時の問題は、スクリプトdebconf
の実行中にpostinst
私が使用していないフロントエンドが有効になっていることでしたdebconf
。しかし、ロードされた行に注釈を付けましたconfmodue
。
# . /usr/share/debconf/confmodule
確かに、dpkg-reconfigure
(私も推測していますdpkg
。)ファイル(、、および)の "confmodule"文字列と一致するconfmodule
とロードされると見なされます。したがって、confmoduleを効果的にロードしていない間、dpkg-reconfigureはフロントエンドを解放しなかったため、サービスは他のインスタンスを起動できませんでした。解決策は単に行を削除することです。config
postinst
prerm
debconf
答え2
まず、スタンドアロンプログラムでdebconfを使用するのは間違っているようです。man debconf-devel
他のスクリプトセクションの引用:
他のスタンドアロンプログラムでもdebconfを使用できます。ここで注目すべき問題は、debconfが意図されておらず、レジストリとして使用できないことです。これは最終的にUnixであり、プログラムはあいまいなdebconfデータベース(とにかくキャッシュだけであり、おそらく飛ぶでしょう)ではなく/ etcのファイルで構成されています。したがって、スタンドアロンプログラムでdebconfを使用する前に慎重に考えてください。
同じマニュアルページは、前のセクション(POSTINST SCRIPT)の実際の問題を解決するのにも役立ちます。
postinstがデーモンを起動する場合は、debconfに最後に停止するように指示する必要があります。 debconfはpostinstが完了した時点で少し混乱する可能性があるためです。
つまり、db_stop
デーモンを起動する前に問題を発行してください(debconf自体を使用しなくても)。