Какой самый быстрый способ использовать lsof для поиска одного открытого файла? - PullRequest
6 голосов
/ 27 марта 2010

Я пытаюсь проверить один файл, если он открыт с помощью lsof. Есть ли более быстрый способ, чем этот?

$result = exec('lsof | grep filename | wc -l');

if($result > 0) {
    //file is open
}

Я думаю, что это должен быть способ просто проверить один файл, если вы знаете имя файла. Все, что мне действительно нужно, это правда или ложь.

Ответы [ 4 ]

10 голосов
/ 27 марта 2010

Я нашел намного лучший способ. С помощью lsof (протестировано на версии 4.63) вы можете напрямую запросить определенный файл:

if lsof filename > /dev/null; then
    # file is open
fi
2 голосов
/ 27 марта 2010

Что ж, вы можете пропустить wc и использовать возвращаемое значение grep (grep возвращает 0 (т. Е. Успех), если он обнаруживает шаблон, и 1 (т. Е. Неуспешно), если он не обнаруживает шаблон):

if lsof | grep filename > /dev/null; then
    # filename is in output of lsof
fi

Вы можете немного улучшить это, используя -l флаг grep:

if lsof | grep -l filename > /dev/null; then
...

Это заставляет grep перестать смотреть, как только он обнаружит свое первое совпадение.

1 голос
/ 27 марта 2010

Не. Ответ может измениться к тому времени, когда вы попытаетесь что-либо сделать с результатом. Вместо этого попробуйте сделать все, что вы намеревались сделать с файлом, и обработать ошибку «в использовании» или «нарушение общего доступа».

1 голос
/ 27 марта 2010

Используйте fuser. Возвращает ненулевое значение, если какой-либо из указанных файлов используется, и нулевое значение, если все они доступны.

...