我尝试做
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 进程是随机的:管道并行运行ps
,grep
并且通常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 问题的最佳方法。看斯特凡·查泽拉斯的回答为了这。