如何识别锁定文件的进程?

Bra*_*iam 42 process

我想知道使用锁定文件的确切过程。我不想修复它,只是想知道我的系统在做什么。我怎样才能知道?

例如,此消息:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
Run Code Online (Sandbox Code Playgroud)

同样,我只想确定使用它的过程,而不是如何修复它。

Bra*_*iam 46

有一个臭名昭著的lsof

sudo lsof /var/lib/dpkg/lock
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aptitude 4974 root    3uW  REG   8,23        0 815673 /var/lib/dpkg/lock
Run Code Online (Sandbox Code Playgroud)

在这种情况下,aptitude 正在使用该文件。如果您不确定哪个用户正在锁定文件,您应该使用 root。它对很多东西也很有用,遗憾的是它没有随 Ubuntu 一起安装,所以你必须先安装它。

对于其他凡人,这是fuser命令。这很奇怪,因为它只返回 PID 而不是进程名称:

?  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974
Run Code Online (Sandbox Code Playgroud)

这里说的是文件和PID,也就是4974,所以我们必须调查谁是:

?  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Run Code Online (Sandbox Code Playgroud)

  • 为什么`lsof`臭名昭著?它有什么问题吗? (6认同)
  • @Ruslan 是的,它允许无知的用户知道系统的实际使用情况,这与系统管理员想要的相反...... (3认同)

小智 10

lslocks 是一种简单的方法。

lslocks |grep /var/lib/dpkg/lock
Run Code Online (Sandbox Code Playgroud)

使用 shell 处理进程 ID:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
Run Code Online (Sandbox Code Playgroud)