1

У меня проблема с Mac и Windows SMB, когда я использую Excel 2011.

Если я открою документ Excel из общего ресурса Windows, он создаст "файл Ghost", начинающийся с ~ $, затем полное имя файла, например:

Если я открыл testdoc.xlsx, будет создан файл-призрак с именем ~ $ testdoc.xlsx, это не является серьезной проблемой, так как при закрытии документа файл удаляется.

Этот файл становится проблемой, когда мои пользователи работают через VPN, и если они отключают свою VPN, не закрывая документ об исключении, файл "Ghost" остается позади, и тогда любой пользователь Mac может открыть файл только для чтения, пока этот файл не станет удален.

Я попытался с помощью команды Apple ::

по умолчанию напишите com.apple.desktopservices DSDontWriteNetworkStores true

Эта остановка приводит к тому, что маки пишут ресурсы и DS хранят файлы в сетевых файлах, но не останавливают создание этого файла-призрака.

Кто-нибудь знает, что это за файлы? Как остановить их создание? Безопасно ли их остановить?

С уважением

1 ответ1

0

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

Ясно, что лучшим решением было бы заставить ваших пользователей действовать ответственно, но это, конечно, безнадежное дело :).

Итак, я бы запустил небольшой cronjob, который бы искал такие файлы, проверил, открыт ли данный файл в данный момент, и если нет, удалил файл блокировки. Проблема в том, что единственный известный мне способ проверить, открыт ли файл, - это lsof котором перечислены процессы, которые в данный момент обращаются к данному файлу. Однако это будет работать только при запуске с компьютера, который в данный момент обращается к файлу, а не с сервера. Если вы запустите его на сервере, и ваш пользователь откроет его на своей локальной машине, он не вернет ничего.

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

#!/bin/bash
## Define the regular expression we will use
regex='(.*)~\$(.+)'

## Find all files that begin with "~\$*" in the directory
## specified on the command line, the lockfiles
find ${@} -name "~\$*" -print0 2>/dev/null | while IFS= read -r -d '' file; do

    if [[ $file =~ $regex ]]
    then
        ## Get the name of the file that created the lockfile
        realname=${BASH_REMATCH[1]}${BASH_REMATCH[2]};
        ## Check if the file is currently open
        isopen=`lsof "$realname" 2>/dev/null | wc -l`
        ## If the file is not open (by a program running on the
        ## same machine as this script, delete the lockfile
        if (( $isopen == 0))
        then
            echo "Deleting $file..."
            rm "$file"
        fi
    fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .