如何杀死持有 apt 锁的进程?

ice*_*ard 6 kill ps apt lock

我试着做

sudo apt update
Run Code Online (Sandbox Code Playgroud)

但得到:

无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)

E: 无法锁定目录 /var/lib/apt/lists/

我正在尝试获取最新版本的 mongod。按照我发现的一些说明,我做了:

$ ps aux | grep apt
5019  0.0  0.0  14224   980 pts/0    S+   02:52   0:00 grep --color=auto apt
Run Code Online (Sandbox Code Playgroud)

但我不知道我应该插入其中的哪一部分

kill -9 processnumber <id>
Run Code Online (Sandbox Code Playgroud)

使其工作。

哪个部分是ID,有什么办法可以防止这种情况再次发生?

Sté*_*las 10

如果您想根据名称或参数列表终止进程,请使用pkill.

pkill regexp
Run Code Online (Sandbox Code Playgroud)

将杀死名称与regexp扩展正则表达式匹配的所有进程。

pkill -f regexp
Run Code Online (Sandbox Code Playgroud)

将终止其参数列表(包括通常包含命令名称的第一个)与空格连接的所有进程与正则表达式匹配。

然而,这里看起来更像是您想要终止持有/var/lib/apt/lists/lock锁定文件的进程,因此:

fuser -k /var/lib/apt/lists/lock
Run Code Online (Sandbox Code Playgroud)

(使用一些热熔器实现)或

lsof -t /var/lib/apt/lists/lock | xargs kill
Run Code Online (Sandbox Code Playgroud)

可能更合适。

尽管您可能想使用lsof /var/lib/apt/lists/lock或来检查它首先是什么进程fuser /var/lib/apt/lists/lock。并尽可能正常退出,而不是冷酷地杀死它。

在任何情况下,避免kill -9让进程没有机会干净地退出。


Gil*_*il' 5

这说明了为什么不应该使用ps … | grep ….

ps打印标题行。但是由于输出是通过管道输入的grep,并且 grep 模式与标题行不匹配,因此您看不到标题行。在标题行中,您会看到一个名为 的列PID。此列中的值是您需要传递给 的值kill

当您运行时ps … | grep …,这通常会列出 grep 进程本身。在您的情况下,您只看到 grep 过程。无论你看到grep的进程或不是随机的:在管路psgrep并行,而且经常grep有时间的时候开始ps运行,但有时ps运行速度非常迅速,grep还没有开始。有一些技巧可以避免看到 grep 过程,例如确保模式与自身不匹配:

ps aux | grep '[a]pt'
Run Code Online (Sandbox Code Playgroud)

但是有更可靠的方法可以做到这一点。Linux 和其他系统提供了一个名为pgrep. 它的工作原理有点像,ps … | grep …但更可靠。

pgrep apt
Run Code Online (Sandbox Code Playgroud)

要获取有关进程的信息,您可以将进程 ID 传递给ps

ps $(pgrep apt)
Run Code Online (Sandbox Code Playgroud)

如果你想把他们全部杀死,你可以将pgrep命令更改为pkill. 如果您只想杀死其中的一些,请向pgrep命令行添加更多条件,使其仅匹配您想要的进程,或者从ps输出中手动选择 PID 。

Linux 的ps命令还可以通过多个条件匹配进程,包括命令名称,但您需要精确匹配,而pgrep可以找到子字符串和更一般的正则表达式匹配。

ps -C apt     # won't find e.g. apt-get
Run Code Online (Sandbox Code Playgroud)

但是,这些都不是解决 apt 锁定问题的最佳方法。请参阅Stéphane Chazelas 对此的回答