Альтернатива 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"
Другие вопросы по тегам