我试着做
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
让进程没有机会干净地退出。
这说明了为什么不应该使用ps … | grep …
.
ps
打印标题行。但是由于输出是通过管道输入的grep
,并且 grep 模式与标题行不匹配,因此您看不到标题行。在标题行中,您会看到一个名为 的列PID
。此列中的值是您需要传递给 的值kill
。
当您运行时ps … | grep …
,这通常会列出 grep 进程本身。在您的情况下,您只看到 grep 过程。无论你看到grep的进程或不是随机的:在管路ps
和grep
并行,而且经常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 对此的回答。
归档时间: |
|
查看次数: |
27383 次 |
最近记录: |