Я хотел бы определить, какой процесс владеет файлом блокировки. Файлы блокировки - это просто файл с определенным именем, которое было создано.
Итак, как я могу определить, какой процесс имеет определенный файл, открытый в Linux? Предпочтительно однострочник или конкретное инструментальное решение для Linux будет оптимальным.
if [
fuser "$ file" `]; затем выход`ls
следует ниже - он возвращает код выхода 2, если есть ошибка (например, указана неверная опция) или файл не найден (и 0, если он успешно сообщает информацию).На большинстве систем Linux
lsof NAME
делает работу:источник
cwd
строки (которые используют отчет как текущий рабочий каталог процесса) только каталоги отчетов.Открытие файла не является блокировкой, потому что, если каждый процесс должен сначала проверить, открыт ли файл, а не продолжить, если он есть, или создать или открыть его, если это не так, то два процесса вполне могут проверить одновременно, оба найдут что он не открыт, то создайте или откройте его.
Чтобы использовать файл в качестве блокировки, операция проверки и блокировки должна быть единственной непрерывной операцией. Вы можете добиться этого в файловой системе Unix, создав файл в режиме только для чтения и удалив его, чтобы разблокировать. Если файл существует (и доступен только для чтения), создание файла завершится неудачно, поэтому вы получаете проверку и блокировку в одной атомарной операции.
Если ваш процесс блокировки представляет собой сценарий оболочки, который будет работать как демон, вы можете получить этот эффект, используя параметр
Это также записывает PID собственного процесса в файл, что решает вашу другую проблему:umask
для каждого процесса, который устанавливает разрешения для создания новых файлов:cat /var/lock/foo
Что касается конкретного вопроса «В каких процессах этот файл открыт?», Это может быть полезно, если вы хотите размонтировать файловую систему, но не можете, потому что у какого-то процесса есть открытый файл. Если у вас нет этих команд, вы можете задать их
/proc
как root:ls -l /proc/*/cwd | grep '/var/lock/foo$'
или, как смертный пользователь:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'
источник
Если вы хотите знать, какой именно дескриптор файла процесса ссылается на ваш файл без
lsof
илиfuser
- выполните поиск через/proc
:Замените
$1
на открытое имя файла, которое вы ищете. Вы можете изменить то,-printf
что вы хотите видеть, или указатьegrep -o '[0-9]+' | head -1
для использования информацию этого процесса.ps -Fp <pid>
Ответ на @fin является лучшим ответом, очевидно, но ответить @ комментарий JoseLSegura в , если это не доступно, решение выше , был мой ответ.
$ lsof <filename>
источник
Я обнаружил, что при использовании принятого ответа не было перечислено процессов, которые использовали мой каталог (ubuntu 14.04).
В конце концов, я использовал lsof (список открытых файлов) и набрал его вывод, чтобы найти процесс, вызывающий ошибку:
источник
lsof
- его выбор-R
. например:lsof -R [filename]