Существует ли более быстрый способ проверить, используется ли файл?

Я ищу функцию командной строки или функцию c, которая сообщит мне, открыт ли файл/используем чем-то.

lsof и fuser действительно скажите это, но они обеспечивают много другой информации, которая приводит к взятию до 300 мс в некоторых ситуациях (как то, когда я использую этот код на Mac OS X, я - devving для Linux и OS X) (у меня есть решение для окон, которое берет 5 мс, таким образом, я пытаюсь найти что-то в Unix, который также очень быстр, и просто возвращает TRUE или FALSE, если файл используется),

8
задан 23 September 2014 в 23:46

2 ответа

Если Вы будете использовать это в качестве блокировки, то она не будет работать ни одним lsof или fuser предотвратите условия состязания.

Базовый процесс это lsof делает тралить посредством всех процессов /proc/*/fs поиск открытых дескрипторов файлов. Это собирается занять время независимо от того, что Вы делаете.

Можно сделать это сами, но это вряд ли будет немного быстрее, поскольку необходимо проверить на каждый открытый процесс в системе.

Если то, что Вы делаете, строго ограничено во времени, выясните другой способ сделать это.

  • Если Вы управляете файлом через программу, которую Вы записали; используйте файл блокировки.
  • При выполнении некоторой команды, которая воздействует на файл, посмотрите и посмотрите, какая документация, которые управляют/программируют предложениями и видят, не может ли это сделать lockfile. Сбой этого, посмотрите, не может ли он сделать файл со своим PID в нем. Затем можно посмотреть на /proc/<PID>/fs видеть, открыт ли Ваш файл в настоящее время или нет. Рассмотрение только одного процесса открытые дескрипторы файлов будет намного быстрее затем отображаться через всех них.
  • Иначе для помощи Вам, я испытываю необходимость в большей информации о том, что Вы делаете.

Вы дали больше информации в комментарии, что Вы хотите определить, работает ли Firefox на данной системе. Лучший способ сделать это должно искать файлы блокировки Firefox. Они хранятся в местоположениях по умолчанию, указанных на Wiki Mozilla.

Например, на Linux, имейте свою программу, делают следующее:

  • откройтесь ~/.mozilla/firefox/ каталог.
  • Перечислите все каталоги, фильтрующие для каталогов, заканчивающихся в .default. (Я думаю весь конец профилей с .default, если не только проверяют в каждый каталог.)
  • В каждом каталоге выше, ищите существование названного файла lock или .parentlock. Если Вы видите один или оба файла, Firefox открыт.

Этот алгоритм должен выполниться быстрее, чем, что Вы в настоящее время делаете на окнах.

9
ответ дан 16 November 2019 в 17:38

TL; DR

В один из Ваших комментариев , Вы заявляете:

Хорошо моя точная ситуация: у Меня есть путь к файлу. Это заблокировано, если Firefox работает. Я хочу видеть, работает ли его заблокированный или не сказать, если Firefox.

Ваш исходный вопрос о lockfiles походит на длинный путь, вокруг того, когда существуют более легкие способы узнать, работает ли Firefox за данным пользователем, и осмотреть его состояние процесса.

состояние Процесса Исследования

А более разумный способ найти PID данного процесса состоит в том, чтобы использовать pgrep от пакет procps . Например:

$ pgrep -u $LOGNAME firefox
5671

можно тогда осмотреть состояние PID с ps:

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

или просто получают флаги состояния без любого другого хлама:

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

Одна моя система, острота выше последовательно берет только 1,4 миллисекунды для завершения. Ваш пробег может варьироваться.

Коды состояния Процесса

раздел PROCESS STATE CODES PS (1) детали, что различное состояние отмечает средний. На Ubuntu 14.04 говорится в странице справочника:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group
1
ответ дан 16 November 2019 в 17:38

Другие вопросы по тегам:

Похожие вопросы: