Альтернатива lsof - обнаружение заблокированного файла
Файл блокируется с помощью fcntl (неблокирующего) или каким-либо другим способом. Поэтому я использую lsof и проверяю, есть ли здесь pid процесса. Если lsof возвращает пустое значение, то ничто не использует его.
Однако lsof из моего сценария занимает 200 мс.
В Windows, когда я пытаюсь проверить, заблокирован ли файл, я просто открываю файл, а в случае ошибки он блокируется, это занимает 5 мс. Есть ли альтернатива lsof, чтобы сделать быстрый тест, чтобы увидеть, есть ли файл?
2 ответа
Команда fuser - очень умная утилита Unix, используемая для определения, какой процесс использует файл, каталог или сокет. Он также предоставляет информацию о пользователе, владеющем процессом, и типе доступа. ЧИТАЙТЕ БОЛЬШЕ --digitalocean.com
Чтобы показать процессы, обращающиеся к определенному каталогу, используйте:
fuser -uvm /somedir
Приведенный ниже вывод показывает, что при запуске в подробном режиме утилита fuse выдает информацию о USER, PID, ACCESS and COMMAND
root@exampleuser-X55CR:~# fuser -v .
USER PID ACCESS COMMAND
/root: root 3378 ..c.. vim
root 3398 ..c.. bash
root 3449 ..c.. bash
root 19370 ..c.. bash
fuser
полезен при идентификации идентификатора процесса при открытии определенного файла.
lsof
полезно выяснить все файлы, открытые определенным процессом.
для получения дополнительных опций, которые идут с fuser вы можете проверить их man-страницу man fuser
вот некоторые:
]$ fuser
No process specification given
Usage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...
[ - ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...
fuser -l
fuser -V
Show which processes use the named files, sockets, or filesystems.
-a display unused files too
-c mounted FS
-f silently ignored (for POSIX compatibility)
-i ask before killing (ignored without -k)
-k kill processes accessing the named file
-l list available signal names
-m show all processes using the named filesystems
-n SPACE search in this name space (file, udp, or tcp)
-s silent operation
-SIGNAL send this signal instead of SIGKILL
-u display user IDs
-v verbose output
-V display version information
-4 search IPv4 sockets only
-6 search IPv6 sockets only
- reset options
udp/tcp names: [local_port][,[rmt_host][,[rmt_port]]]
Чтобы найти все PID процессов, использующих файл, запустите эту функцию оболочки, которая проверяет каталог /proc.
#!/bin/bash
set -o pipefail
shopt -s extglob
_lsof() {
local f="${1}" \
inum
inum="$(ls -i "$(readlink -f "${f}")" 2> /dev/null )" && \
( find /proc/+([0-9])/fd -follow -inum ${inum%% *} 2> /dev/null || : ) | \
cut -f 3 -s -d '/' | \
sort -n -u | \
grep -sxvF "1"
}
pids="$(_lsof "filename")" || \
echo "file is not in use"