Как предотвратить очистку папки внутри /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
Другие вопросы по тегам