Як визначити процес блокування файлу?


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?

Знову ж таки, я просто хочу визначити процес, використовуючи його, а не як його виправити.

Відповіді:


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

У цьому випадку вміння використовувати файл. Ви повинні використовувати 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сумно відомий? Чи є з цим якісь проблеми?
Руслан

3
@Ruslan Так, це дозволяє зрозумілим користувачам знати фактичне використання систем всупереч тому, що хочуть sysadmins ...
Брайам

@Braiam Занадто багато інформації може бути небезпечною справою, у правильних руках? ^ -_- ^
Пітер Девід Картер

Другий варіант в одному рядку:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea

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

Так. lslocksце найкращий шлях для цього. Використання lsofдало мені цю помилку: "lsof: ПОПЕРЕДЖЕННЯ: не можу stat () файлову систему fuse.gvfsd-fuse / run / user / 1000 / gvfs Інформація про вихід може бути неповною"
Nav

@Nav, це не помилка, а ПОПЕРЕДЖЕННЯ.
Брайам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.