如何安全地中止apt-get安装?


44

我的apt-get install程序似乎processing triggers for python-support步入了绝望的境地。

我倾向于这样kill做,但是在过去,简单地- kill一个apt-get install过程引起了我很大的悲伤。(IIRC各种锁定文件被遗忘,等等。)

有没有更安全的方法来停止此过程?

Answers:


44

杀死进程

一般来说,杀死进程没有比常规杀死(SIGTERM)更安全的方法了。如果是交互式过程,通常可以通过发送SIGINT信号(通常通过按Ctrl+ 来发送)将其停止,甚至更加安全C。该信号被进程本身可以捕获的陷阱侦听-通常会优雅地停止。谢谢Eliah

DPKG数据库

关于包管理是一种特殊情况。APT命令在水下使用的DPKG数据库始终可以检测操作是否尚未完成。每个软件包都具有标记为实际状态以及当前状态(例如,未打包,已配置等)。通过终止APT前端,数据库将处于损坏状态,但是处于已知状态。锁定文件只有在恢复到干净状态后才会释放-您应该修复此问题,直到允许新操作为止。

解决方法仅是触发一个过程,以使所有软件包都处于配置状态。实际上,如果您中断了某个apt-get操作,则可以稍后使用

sudo dpkg --configure -a

它知道如何从中断状态恢复到所有配置状态,从这种意义上说,它只是从中断状态继续进行。锁定文件将保留在那里,直到您完成操作为止,这是有原因的-防止DPKG数据库处于不干净状态时进行新操作。

关于SIGKILL(9)

发送SIGKILL(十进制表示9)非常不安全。该信号不会被进程捕获,但是无论进程是否喜欢,操作系统(内核)都会清理整个进程。文件系统上文件的状态可以保持为损坏状态。除非不再听其他优美的信号,否则切勿发送这些信号。


2
当应用程序提供一种终止它的方法时,通常比SIGTERM更安全。例如,大多数(如果不是全部)文本编辑器,文字处理器,图形程序,Web浏览器以及其他基于文本或图形的应用程序(用户可能会创建不应丢失的内容)不会自动保存它们在他们收到SIGTERM 之前退出。另外,请注意,SIGINT有时可能比SIGTERM更安全(但除非明确要求与Ctrl + C相同的结果,否则通常不应该发送SIGINT)。
伊利亚·卡根

16

当我遇到apt-get失败时,请执行以下操作(以root用户身份,即sudo在所有命令之前):

  1. 终止名为apt-get的进程:

    Killall -9 apt-get
  2. 重新配置dpkg:

    dpkg-配置-a
  3. 更新apt-get:

    apt-get更新
  4. 更新软件包,包括未正确安装的软件包:

    apt-get升级

我从某个地方学到了这一点,但不幸的是我不记得确切的位置。


6
除非您有充分的理由,否则请不要发送信号9(SIGKILL)。看到我更新的答案。
gertvdijk

3
sudo dpkg -r <package name>

就我而言,我在Ubuntu 12.04上遇到了Java 8的问题,所以...

sudo dpkg -r oracle-java8-installer

1

Linux和其他Unix类型的系统从命令行来看非常强大,但是一旦进程启动,就不会原谅。发送一个进程的终止信号肯定会终止正在运行的进程,但是请记住,您使数据库处于不稳定状态。最后一条记录可能未正确关闭,因此您有必须修复数据库的风险。不仅适用于apt,而且适用于任何应用程序。

始终尝试以正常方式结束应用程序,并仅杀死运行了应用程序的进程。


0

这是我的操作方式,Ctrl+ C但是请注意,只要apt-get处于下载阶段或更新缓存,它是安全的。除此之外,我无法想到一种更安全的方法。只要让它完成并通过某种方式卸载或降级撤消更改即可。可以使用以下命令清除下载的文件sudo apt-get autoclean

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.