Я ищу функцию командной строки или функцию c, которая сообщит мне, если файл открыт / используется чем-то.
lsof
и fuser
действительно говорите об этом, но они предоставляют много другой информации, которая в некоторых случаях может занять до 300 мс (например, когда я использую этот код в MAC OS X, я использую Linux и OS X) (у меня есть окна решение, которое занимает 5 мс, поэтому я пытаюсь найти что-то в Unix, что также очень быстро, и просто возвращает истину или ложь, если файл используется)
command-line
files
Noitidart
источник
источник
Ответы:
Если вы используете это как замок, он не будет работать , как ни
lsof
илиfuser
предотвратить условия гонки.Основной процесс, который
lsof
делает это, - это обход всех процессов,/proc/*/fs
ищущих дескрипторы открытых файлов. Это займет время независимо от того, что вы делаете.Вы можете сделать это самостоятельно, но вряд ли это будет быстрее, поскольку вам нужно проверять каждый открытый процесс в системе.
Если то, что вы делаете, критично ко времени, найдите другой способ сделать это.
/proc/<PID>/fs
открыт ли ваш файл в настоящее время или нет. Просмотр только одного дескриптора открытого файла процесса будет намного быстрее, чем отображение всех из них.Вы дали больше информации в комментарии, который вы хотите определить, работает ли Firefox в данной системе. Лучший способ сделать это - найти файлы блокировки Firefox. Они хранятся в местах по умолчанию, указанных в вики Mozilla.
Например, в Linux ваша программа должна сделать следующее:
~/.mozilla/firefox/
каталог..default
. (Я думаю, что все профили заканчиваются.default
, если не просто лезть в каждый каталог.)lock
или.parentlock
. Если вы видите один или оба файла, Firefox открыт.Этот алгоритм должен выполняться быстрее, чем то, что вы делаете в Windows в настоящее время.
источник
ps aux firefox
. Возьмите эти PID и найдите их в/proc/
файловой системе.ps aux firefox
. Ну, моя точная ситуация такова: у меня есть путь к файлу. Он заблокирован, если запущен Firefox. Я хочу увидеть, заблокирован ли он или нет, чтобы узнать, работает ли Firefox.TL; DR
В одном из ваших комментариев вы заявляете:
Ваш первоначальный вопрос о файлах блокировок кажется длинным, когда есть более простые способы выяснить, работает ли Firefox для данного пользователя, и проверить его состояние процесса.
Изучение состояния процесса
Более разумный способ найти PID данного процесса - использовать pgrep из пакета procps . Например:
Затем вы можете проверить состояние PID с помощью ps :
или просто получи государственные флаги без всякой хулиганы
Одна моя система, одна строка выше, последовательно занимает всего 1,4 миллисекунды. Ваш пробег может варьироваться.
Коды состояния процесса
Раздел «КОДЫ СОСТОЯНИЯ ПРОЦЕССА» в ps (1) подробно описывает, что означают различные флаги состояния. На Ubuntu 14.04 на странице руководства написано:
источник
~/.mozilla/firefox/*/lock
. Затем вы можете идентифицировать сеанс, посмотрев имя родительского каталога каждого файла блокировки. На других платформах это не работает. Наш чат рассказывает больше о том, как заставить его работать на Mac (что не очень важно для Ubuntu, но у вас это есть). Чтобы быть справедливым, он действительно должен обновить вопрос, чтобы быть более конкретным. : P