インストール中にdebconf
を使用してUbuntu16.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
を強制しようとしましたが、他のエラーが表示されます。
dpkg
プロセスが終了し、debconf
がすでに終了した後、デーモンを強制的に起動する必要があると思います。何かアイデアはありますか?
まず、スタンドアロンプログラムでdebconfを使用するのは間違っていると感じます。引用するにはman debconf-devel
、セクションその他のスクリプト:
他のスタンドアロンプログラムでdebconfを使用することもできます。ここで注意すべき問題は、debconfが意図されたものではなく、レジストリとして使用してはならないということです。結局のところ、これはUNIXであり、プログラムは/ etc内のファイルによって構成されており、あいまいなdebconfデータベース(とにかくキャッシュにすぎず、吹き飛ばされる可能性があります)ではありません。したがって、スタンドアロンプログラムでdebconfを使用する前に、じっくり考えてください。
同じマニュアルページは、前のセクション(POSTINST SCRIPT)の実際の問題にも役立ちます。
Postinstがデーモンを起動する場合は、必ずdebconfに最後にSTOPを指示してください。そうしないと、postinstがいつ実行されるかについてdebconfが少し混乱する可能性があるためです。
つまり、発行db_stop
デーモンを起動する前(debconf自体を使用しない場合でも)。
それで、ようやく問題を見つけました。将来誰かに役立つ場合に備えて投稿します。
私が言ったように、私はpostinst
スクリプトからサービスを開始しようとしていて、サービスはdebconfig
を使用していくつかの構成パラメーターをフェッチしようとしましたが、debconf
実行中のインスタンスがすでに1回あったため(すべての構成はconfig
ではなく、postinst
ファイルで行われました)。
問題は、debconf
を使用していないときに、postinst
スクリプトの実行中にアクティブなdebconf
フロントエンドがあったことでした。ただし、confmodue
をロードする行にコメントしました。
# . /usr/share/debconf/confmodule
どうやら、 dpkg-reconfigure
(そして私はdpkg
も推測します)ファイルの「confmodule」文字列と一致する場合はconfmodule
がロードされると考えます(config
、postinst
およびprerm
)。そのため、confmoduleを効果的にロードしていなかったのに、dpkg-reconfigureがフロントエンドを解放していなかったため、サービスは別のdebconf
インスタンスを開始できませんでした。解決策は、単にその行を削除することでした。