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

Я хочу знать точный процесс, который использует файл блокировки. Я не хочу исправить это, но просто чтобы знать, что делает моя система. Как я могу узнать?

Например, это сообщение:

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?

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

33
задан 05.05.2020, 18:05

2 ответа

Существует печально известная 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
0
ответ дан 05.05.2020, 18:05
  • 1
    Почему lsof печально известны? Есть ли некоторые проблемы с ним? – Lev 05.05.2020, 18:06
  • 2
    @Braiam Слишком много информации может быть опасной вещью в правых руках? ^-_-^ – demon4222 05.05.2020, 18:06
  • 3
    @Ruslan Да, это позволяет невежественным пользователям, знают фактическое использование систем вопреки тому, что системных администраторов хочет... – Lev 05.05.2020, 18:07
  • 4
    Вторая опция в одной строке: ps $(sudo fuser /var/lib/dpkg/lock) – Delena Malan 05.05.2020, 18:07

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

lslocks |grep /var/lib/dpkg/lock

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

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
0
ответ дан 05.05.2020, 18:06
  • 1
    @Nav that' s не ошибка, а ПРЕДУПРЕЖДЕНИЕ. – demon4222 05.05.2020, 18:06
  • 2
    Да. lslocks лучший способ пойти об этом. Используя lsof дал мне эту ошибку: " lsof: ПРЕДУПРЕЖДЕНИЕ: can' t статистика () fuse.gvfsd-плавят файловую систему/run/user/1000/gvfs, Выходная информация может быть incomplete" – Theofanis 05.05.2020, 18:07

Теги

Похожие вопросы