Как определить процесс блокировки файла?

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?

Опять же, я просто хочу определить процесс, используя его, а не как это исправить.

Braiam
источник

Ответы:

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
Braiam
источник
6
Почему lsofпечально? Есть ли проблемы с этим?
Руслан
3
@Ruslan Да, это позволяет невежественным пользователям знать фактическое использование систем вопреки
желанию
@Braiam Слишком много информации может быть опасной вещью, в правильных руках? ^ -_- ^
Питер Дэвид Картер
Второй вариант в одной строке:ps $(sudo fuser /var/lib/dpkg/lock)
17
8

lslocks - это простой способ сделать это.

lslocks |grep /var/lib/dpkg/lock

Для использования оболочки для обработки идентификатора процесса:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
jolestar
источник
Да. lslocksэто лучший способ сделать это. Использование lsofдало мне эту ошибку: «lsof: WARNING: не может stat () fuse.gvfsd-fuse файловая система / run / user / 1000 / gvfs Выходная информация может быть неполной»
Nav
@Nav это не ошибка, но ПРЕДУПРЕЖДЕНИЕ.
Брайам