Как предотвратить очистку папки внутри /tmp?
Этот вопрос касается Ubuntu 14.10 на моем ноутбуке разработчика.
У меня есть папка в /tmp
это используется приложением, чтобы поместить туда временные данные. Это приложение обычно создает временную папку в моем домашнем каталоге и впоследствии удаляет ее. По некоторым причинам это не работает, когда homedir зашифрован. Поэтому вместо этого я сделал символическую ссылку на /tmp/foo
в моем доме. Мое приложение может написать туда и сделать его временной подпапкой.
Сейчас /tmp/foo
удаляется каждый раз, когда я перезагружаю свою машину. До сих пор я просто заново создавал папку после перезагрузки. Теперь я узнал, как очищается каталог / tmp? что есть работа, делающая это.
Я смотрел на /etc/init/mounted-tmp.conf
но моего bashfu и особенно моего findfu недостаточно, чтобы делать то, что я хочу. Вот выдержка из этого файла:
EXCEPT='! -name . ! ( -path ./lost+found -uid 0 ) ! ( -path ./quota.user -uid 0 ) ! ( -path ./aquota.user -uid 0 ) ! ( -path ./quota.group -uid 0 ) ! ( -path ./aquota.group -uid 0 ) ! ( -path ./.journal -uid 0 ) ! ( -path ./.clean -uid 0 ) ! ( -path "./...security*" -uid 0 )' # Remove all old files, then all empty directories find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete
Что я хочу сделать, это добавить условие, которое заставляет его удалить все внутри /tmp/foo
, но нет /tmp/foo
сам. Как я могу это сделать?
5 ответов
/etc/init/mounted-tmp.conf
является частью mountall
пакет, поэтому любые обновления этого пакета и предлагаемые изменения будут отменены.
$ sudo dpkg -S /etc/init/mounted-tmp.conf
mountall: /etc/init/mounted-tmp.conf
Вместо этого, в соответствии со стандартом файловой системы Hierachy (FHS);
Относительно / TMP:
Программы не должны предполагать, что какие-либо файлы или каталоги в / tmp сохраняются между вызовами программы.
Относительно / var / tmp:
Каталог / var / tmp доступен для программ, которым требуются временные файлы или каталоги, которые сохраняются между перезагрузками системы. Поэтому данные, хранящиеся в / var / tmp, более постоянны, чем данные в / tmp.
Таким образом, вы должны изменить свою символическую ссылку, чтобы использовать /var/tmp
вместо /tmp
,
Не совсем ответ на ваш вопрос, но вы можете найти /var/tmp
быть более подходящим местом, так как он не очищается после перезагрузки. Он предназначен для временных файлов, которые не должны автоматически удаляться через короткое время.
Однако я часто создаю себе папку в / opt для хранения случайных вещей, которые мне не нужны дома. Это подходящее место для размещения вещей, которые находятся вне контроля основной ОС.
Вот так:
EXCEPT='! -name .
...
! ( -path "./foo" )'
# Remove all old files, then all empty directories
...
find /tmp/foo/* -depth -xdev $TEXPR -delete
Пример:
$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$
Я согласен с пользователем aap: Вы должны либо позаботиться об этом в программном обеспечении, которое используется для повторного создания каталога, если они являются файлами tmp, либо использовать другой каталог, если они не являются файлами tmp, которые не очищаются.
Плохо иметь файлы с будущим значением и записывать их в каталог / tmp (лучше использовать /var/tmp, как предлагают другие). Тем не менее, вы можете попробовать выстрелить в чаттр. Это должно быть выполнено после выхода из приложения, но до завершения работы. Помните, что эта операция не позволит ничего писать в этот каталог впредь.
Нажмите /tmp/foo/ddmmyy/.001_immute_me chattr +i /tmp/foo/ddmmyy/.001_immute_me
Запустите это:
echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel
затем добавьте это в /etc/inittab, смотрите здесь: где находится файл inittab?:
foo:2345:boot:/bin/foodel
Это создаст /etc/foo при загрузке, если он не существует, а затем очистит его.
Это будет делать то же самое при входе в bash:
echo "/bin/foodel" >> ~/.bashrc