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

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

我尝试做

sudo apt update

但得到:

无法获取锁定 /var/lib/apt/lists/lock - 打开(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

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

kill -9 processnumber <id>

使其发挥作用。

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

答案1

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

pkill regexp

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

pkill -f regexp

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

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

fuser -k /var/lib/apt/lists/lock

(使用一些融合器实现)或

lsof -t /var/lib/apt/lists/lock | xargs kill

可能更合适。

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

无论如何,请避免kill -9不让进程有机会干净退出的情况。

答案2

这说明了您不应该使用 的两个原因ps … | grep …

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

当您运行时ps … | grep …,这通常会列出 grep 进程本身。就您而言,您只能看到 grep 进程。您是否看到 grep 进程是随机的:管道并行运行psgrep并且通常grep在运行时已经来得及启动ps,但有时ps运行得非常快并且grep尚未启动。有一些技巧可以避免看到 grep 过程,例如确保模式与自身不匹配:

ps aux | grep '[a]pt'

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

pgrep apt

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

ps $(pgrep apt)

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

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

ps -C apt     # won't find e.g. apt-get

但这都不是解决 apt lock 问题的最佳方法。看斯特凡·查泽拉斯的回答为了这。

相关内容