问题描述
我有一个apt-get install
过程似乎无可救药地楔入processing triggers for python-support
步骤。
我倾向于kill
它,但在过去,简单的kill
-一个apt-get install
过程让我非常悲痛。 (IIRC保留了各种锁文件等)
有没有更安全的方法来阻止这个过程?
最佳解决方案
杀戮过程
一般来说,为了杀死进程,杀死进程没有比使用常规kill(SIGTERM)更安全的方法。如果它是一个交互式过程,它通常允许您通过发送SIGINT信号来阻止它更安全,通常通过按Ctrl
+ C
发送。这个信号被进程本身捕获,可以听到它 – 通常会优雅地停止。 (thanks Eliah)
DPKG数据库
关于包管理是一种特殊情况。 APT命令在水下使用的DPKG数据库始终可以检测操作是否尚未完成。每个包都具有标记的实际状态以及当前状态,例如,解压缩,配置等。通过终止APT前端,数据库将处于已损坏但处于已知状态。锁文件只有在全部恢复到干净状态后才会被释放 – 你应该修复它直到它允许新的操作。
修复方法只是触发一个进程以使所有包处于已配置状态。实际上,如果您已经中断了apt-get
操作,您可以稍后使用它完成
sudo dpkg --configure -a
它知道如何从断开的状态恢复到all-configured状态,并且从这个意义上说它只是从它被中断的地方继续。锁定文件留在那里直到你完成它,这是有原因的 – 防止DPKG数据库处于不干净状态的新操作。
关于SIGKILL(9)
发送SIGKILL(十进制表示9)非常不安全。该过程不会捕获此信号,但操作系统(内核)将清除整个过程,无论过程是否喜欢。文件系统上的文件状态可能处于损坏状态。除非它不再听到其他更优雅的信号,否则永远不要发送这些信号。
次佳解决方案
当我遇到apt-get失败时,我会执行以下操作(以root用户身份,即所有命令之前的sudo
):
-
杀死名为apt-get的过程:killall -9 apt-get
-
重新配置dpkg:dpkg –configure -a
-
更新apt-get:apt-get更新
-
更新软件包,包括那些未正确安装的软件包:apt-get升级
这是我从某个地方学到的,但不幸的是我记不清究竟在哪里。
第三种解决方案
sudo dpkg -r <package name>
在我的情况下,我在Ubuntu 12.04上遇到了Java 8的问题,所以……
sudo dpkg -r oracle-java8-installer