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


35

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

例如,此消息:

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?

同样,我只想确定使用它的过程,而不是解决方法。

Answers:


38

臭名昭著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

在这种情况下,aptitude正在使用该文件。如果不确定哪个用户锁定了文件,则应使用root用户。它对很多东西也很有用,可惜它不是随Ubuntu一起安装的,因此您必须先安装它。

对于其他凡人,有fuser命令。这是特殊的,因为它仅返回PID而不是进程名称:

➜  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974

它说文件和PID为4974,所以我们必须调查谁是:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude

6
为什么lsof臭名昭著?有问题吗?
Ruslan 2014年

3
@Ruslan是的,它允许无知的用户知道系统的实际使用情况,与系统管理员想要的相反……
Braiam 2014年

@Braiam在正确的手中,太多的信息可能是一件危险的事情?^ -_- ^
Peter David Carter

一行中的第二个选项:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea

8

lslocks是一种简单的方法。

lslocks |grep /var/lib/dpkg/lock

对于使用shell处理进程ID:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done

是。lslocks是最好的方法。使用lsof给了我这个错误:“ lsof:警告:不能stat()fuse.gvfsd-fuse文件系统/ run / user / 1000 / gvfs输出信息可能不完整”
Nav

@Nav不是错误,而是警告。
Braiam '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.