我有一个apt-get install
过程似乎无可救药地卡在了这processing triggers for python-support
一步。
我倾向于kill
这样做,但在过去,简单地对kill
一个过程进行 -ingapt-get install
操作会给我带来很多麻烦。(如果我没记错的话,各种锁定文件都遗留了下来,等等。)
有没有更安全的方法来停止这个过程?
答案1
终止进程
一般来说,对于终止进程而言,没有比常规 kill (SIGTERM) 更安全的方法了。如果是交互式进程,通常可以通过发送 SIGINT 信号(通常通过按Ctrl+发送)来更安全地停止进程C。此信号由进程本身捕获能听它——并且通常会优雅地停止。(谢谢 Eliah)
DPKG 数据库
关于包管理是一种特殊情况。APT 命令在水下使用的 DPKG 数据库始终可以检测操作是否尚未完成。每个包都有一个实际的标记为的状态以及当前的状态,例如解压、配置等。通过关闭 APT 前端,数据库将处于损坏状态,但在已知状态。锁定文件只有在全部恢复到干净状态后才会被释放 - 您应该修复此问题,直到它允许新的操作。
修复的方法是启动一个进程,让所有包都处于配置状态。实际上,如果你中断了某个apt-get
操作,你可以稍后使用以下命令完成它
sudo dpkg --configure -a
它知道如何从损坏状态恢复到完全配置状态,并且从中断处继续。锁定文件会保留在那里,直到您完成该操作,这样做是有原因的 - 防止在 DPKG 数据库处于不干净状态时执行新操作。
关于 SIGKILL (9)
发送 SIGKILL(十进制表示 9)非常不安全。进程无法捕获此信号,但无论进程是否愿意,整个进程都会被操作系统(内核)清理。文件系统上的文件状态可能会处于损坏状态。除非它不再监听其他更合适的信号,否则切勿发送这些信号。
答案2
当我遇到 apt-get 失败时,我会执行以下操作(以 root 身份,即sudo
在所有命令之前):
终止名为 apt-get 的进程:
killall -9 apt-get
重新配置 dpkg:
dpkg--configure-a
更新 apt-get:
apt-get 更新
更新软件包,包括那些未正确安装的软件包:
apt-get 升级
这是我在某个地方学到的,但不幸的是我记不清具体在哪里了。
答案3
sudo dpkg -r <package name>
就我而言,我在 Ubuntu 12.04 上使用 Java 8 时遇到了问题,所以......
sudo dpkg -r oracle-java8-installer
答案4
如果高级软件包工具 (APT)挂起,则/var/lib/dpkg/lock
和/var/lib/dpkg/lock-frontend
锁定文件可能被保留。您可以运行以下过程—Debian Wiki 在问: 当 dpkg 锁被持有时可以做什么?部分。
终止持有锁文件的进程。
sudo fuser -vki -TERM /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend
以下选项被传递给该
fuser
命令——用于识别使用文件或套接字的进程的命令:- -v,--详细启用详细模式。
- -k,- 杀终止访问该文件的进程。除非使用 -信号,发送了 SIGKILL 信号。在这种情况下,交换机
-TERM
指示发送了 SIGTERM 信号。 - -我,- 交互的在终止进程之前请求用户确认。
笔记:如果尽管您尽了最大努力,该
-TERM
选项仍然不起作用,那么请考虑增加fuser
命令的强度,并使用以下命令发送 SIGKILL 信号:sudo fuser -vki -KILL /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend
完成 dpkg 待配置步骤。
sudo dpkg --configure --pending