summaryrefslogtreecommitdiff
path: root/LINUX/LSOF.md
blob: 34ca6767045776676d4203841fd92429306e3452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
👩‍💻 **Как использовать lsof для поиска процессов, блокирующих файлы**

`lsof` — позволяет просматривать информацию об открытых файлах и связанных с ними процессах. Особенно полезно, если вы сталкиваетесь с ошибками доступа к файлам, например, при монтировании, удалении или использовании разделов.

⚙️ **Примеры использования**
🟢 К примеру, если мы не можем удалить файл или получить к нему доступ, выполним:

`lsof /путь/к/файлу

В результате получим список процессов, которые используют файл, с подробной информацией: PID, пользователь, команда и доступ.

🟢 Чтобы просмотреть все файлы, которые были открыты в определенном каталоге, используйте следующую команду:

`lsof +D /директория

➕ **Дополнительно:**

➡️ `lsof -u username` — покажет файлы, открытые процессами указанного пользователя.

➡️ `lsof -p PID` — отображает все файлы, которые использует процесс с заданным PID.

➡️ `lsof -i :PORT` — покажет процессы, использующие определённый сетевой порт.

===================================
⚙️ **Проверка использования порта в Linux**

Иногда нужно узнать, какой процесс использует определённый порт. В Linux это можно сделать несколькими способами.

**📌 Просмотр процессов, занявших порт**

**🟢 Определение процесса по порту:**
`sudo lsof -i :80`
Покажет процесс, использующий порт 80.

**🟢 Вывести PID процесса:**
`sudo netstat -tulnp | grep :80`

Альтернативный способ проверки.

**🟢 Завершение процесса по PID:**
`sudo kill -9 <PID>`
Останавливает процесс, если он мешает запуску сервиса.

**Полезно при отладке серверов, проверки конфликтов между сервисами и устранения проблем с сетью.**


=======================

**Как исправить "rm: cannot remove ‘file’: Device or Resource Busy"?

Бывало же у вас такое - заканчиваешь работать с каким-то ресурсом (файлом/каталогом/устройством), хочешь его удалить и видишь ошибку о том, что он чем-то занят (используется системой либо каким-то процессом).

`rm: cannot remove 'file-or-directory': Device or resource busy

Тут нужно понять, в чем конкретная причина и чем он задействован: то ли процессом, то ли это, быть может, точка монтирования для какой-то FS… 

Распространенных решения вижу 2: 
1. Использование команд "**lsof + fuser**" для определения занятых ресурсов и завершения процессов. Если вы не знаете, какая программа мешает выполнить операцию, используйте **lsof**:

`$ lsof +D Sources/App/

COMMAND   PID    USER   FD   NAME
server  22331 xoadmin  txt    Sources/App/server
client  22332 xoadmin  txt    Sources/App/client

Если у нас ресурс занимают 2 процесса, можно и через **kill** все грохнуть. Если их много, можно более автоматизированно - через **fuser**. Эта команда завершит все процессы, которые что-то используют в целевом каталоге:

`$ fuser -k Sources/App/

После выполнение мы вырубим сразу оба процесса **22331** и **22332**.
2. Определение точки монтирования. Это полезно, когда какая-нибудь флешка или внешний диск монтирован в целевой каталог. Узнать, так ли это, можно через команду **mount**. Допустим, у меня не получается удалить **test**:

`$ rm -rf test

`rm: cannot remove 'test/tmpfsdir': Device or resource busy

Проверяем, является ли **tmpfsdir** точкой монтирования:

`$ mount | grep test/tmpfsdir

`none on /home/u/test/tmpfsdir type tmpfs (rw,relatime,inode64)

Вывод говорит о том, что в каталог **tmpfsdir** примонтирована FS **tmpfs**. Для успешного выполнения операции нужно размонтировать каталог:

`$ sudo umount test/tmpfsdir

`$ rm -rf test