Linux

Sub-process /usr/bin/dpkg returned an error code を解決する手順

はじめに

Ubuntuでapt upgradeしたところSub-process /usr/bin/dpkg returned an error code (1)というエラーがでました。この記事では、このエラーの解決策をまとめます。

前提と環境

以下の通りとなります。

  • OS : Ubuntu18.04

エラーが発生するまでの経緯

はじめに、Sub-process /usr/bin/dpkg returned an error code (1)が出るまでの経緯をメモしておきます。解決策だけ必要な方はとばしてください。
まずapt upgradeをいつも通りに実行したところ、以下のようなエラーが表示されました。

$ sudo apt upgrade
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.

上記の指示通りにsudo dpkg --configure -aを実行したところ、以下のようなエラーが表示されました。

$ sudo dpkg --configure -a
Setting up btrfs-tools (4.4-1ubuntu1.1) ...
update-initramfs: deferring update (trigger activated)
Setting up mysql-server-5.7 (5.7.27-0ubuntu0.16.04.1) ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: error processing package mysql-server-5.7 (--configure):
 subprocess installed post-installation script returned error exit status 1
Setting up libcups2:amd64 (2.1.3-4ubuntu0.10) ...
dpkg: dependency problems prevent configuration of mysql-server:
 mysql-server depends on mysql-server-5.7; however:       
  Package mysql-server-5.7 is not configured yet.

dpkg: error processing package mysql-server (--configure):
 dependency problems - leaving unconfigured
Setting up libcupsimage2:amd64 (2.1.3-4ubuntu0.10) ...    
Processing triggers for libc-bin (2.23-0ubuntu11) ...
Processing triggers for initramfs-tools (0.122ubuntu8.14) ...
Errors were encountered while processing:
 mysql-server-5.7
 mysql-server

どうやらmysql-server-5.7関連でエラーが出ていることが分かります。
そして適当に改めてapt upgradeを実行してみたところ、問題のSub-process /usr/bin/dpkg returned an error code (1)が出ました。

$ sudo apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  golang-go
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
Setting up mysql-server-5.7 (5.7.27-0ubuntu0.16.04.1) ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: error processing package mysql-server-5.7 (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
 mysql-server depends on mysql-server-5.7; however:
  Package mysql-server-5.7 is not configured yet.

dpkg: error processing package mysql-server (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
                                                                                                          Errors were encountered while 
processing:
 mysql-server-5.7
E: Sub-process /usr/bin/dpkg returned an error code (1)

このエラーは、以上の作業を行った場合だけでなく、apt updateの実行時やapt installで新しくパッケージをインストールしようとした場合にも発生することがあります。

原因と解決策

原因は、何かしらの理由でインストール、またはアップデートしようとしたパッケージが壊れてしまったためです。壊れているというのは、例えばパッケージが使用するライブラリの依存関係が干渉してしまったり、整合性が取れなくなったりする場合です。今回の私のケースでは、おそらくアップデート中にインターネット接続が切断されてさらにフリーズしてしまい、パッケージの操作が意図せず中断しまったことで壊れてしまったと考えられます。考えられる解決策としては以下があります。

  • 該当パッケージを完全にインストールし直す
  • 該当パッケージを再構成する
  • 該当パッケージに関する一時ファイルを削除して再インストール、アップデートする

それぞれについて以降で説明します。

該当パッケージを完全にインストールし直す

もしすでに使っているアプリやパッケージではなく、新しくインストールしようとしていたものならば、一度全て削除して再度インストールし直すことで修復できる可能性があります。
例えば、mysql-server-5.7を入れ直す場合ならば、以下のコマンドを実行します。

$ sudo apt remove mysql-server-5.7
$ sudo apt autoremove
$ sudo apt install mysql-server-5.7

該当パッケージを再構成する

以下のコマンドで、壊れたパッケージとその依存関係を解決します。

$ sudo dpkg --configure -a

該当パッケージに関する一時ファイルを削除して再インストール、アップデートする

今回の私のケースではこの方法で解決に至りました。
Ubuntuでは/var/lib/dpkg/info配下に、パッケージのインストール前、インストール後に実行するためのスクリプトファイルや、その他パッケージに関する情報を含むファイルが置かれています。そしてこのディレクトリにある問題のパッケージ(ここではmysql-server-5.7)のpreinstprerm(インストール前用スクリプトファイル)、postinstpostrm(インストール後用スクリプトファイル)の削除します。その後でapt updateapt upgradeが正常に実行できるようになりました。
具体的には、以下のコマンドを実行します。

$ cd /var/lib/dpkg/info
$ sudo mv mysql-server-5.7.post* /tmp
$ sudo mv mysql-server-5.7.pre* /tmp

mysql-server-5.7.post*は、ワイルドカードによる指定でファイル名にmysql-server-5.7.postが付くもの全てという意味です。mysql-server-5.7.pre*も同じです。そしてこれらを/tmpに移動します。/tmpに移動しているのは、本当は削除すればいい場合でも念の為に一時退避する意味です。なお、/tmpは設定によっては一定時間で自動削除されるようになっている場合も多いので、確実に確保しておきたい場合は他のディレクトリに一時退避してもいいかもしれません。

上記を実行後、apt upgradeを問題なく実行できました。

まとめ

備忘録のためにまとめました。同様のエラーに遭遇している方の助けに少しでもなれば幸いです。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。