Как предотвратить очистку папки внутри / tmp?

12

Этот вопрос касается 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сам. Как мне это сделать?

simbabque
источник
Это /tmp/fooкаталог или файл?
тердон
Каталог. Внутри есть файлы.
simbabque
Почему бы не добавить mkdir /tmp/fooпрямо раньше end script?
Хаген фон Айцен
Только к вашему сведению (вы, возможно, уже знаете это): 14.10 достигнет EOL в июле 2015 года, поэтому вы должны действительно перейти на Vivid как можно скорее.
Лео Лам

Ответы:

20

/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.

МГор
источник
3
Классический пример, когда у вас есть молоток, все выглядит как гвоздь.
WernerCD
@WernerCD, не могли бы вы уточнить, что вы подразумеваете под этим? Вы говорите, что /var/tmpэто не очень хорошая идея?
Симбабк
6
Когда все, что у вас есть, это молоток ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Я говорю, что ОП использует / tmp для чего-то, для чего он не предназначен - Использование / tmp в качестве молотка для его проблемы сохранения tmp-но-не-совсем Вещи / var / tmp НЕОБХОДИМО хранить между перезагрузками, поэтому это правильный ответ.
WernerCD
8

Не совсем ответ на ваш вопрос, но вы можете найти /var/tmpболее подходящее место, так как оно не очищается после перезагрузки. Он предназначен для временных файлов, которые не должны автоматически удаляться через короткое время.

Однако я часто создаю себе папку в / opt для хранения случайных вещей, которые мне не нужны дома. Это подходящее место для размещения вещей, которые находятся вне контроля основной ОС.

Эндрю Айлетт
источник
Это правильная идея. Если / tmp не делает то, что вы хотите, сохраните вашу информацию где-нибудь еще - даже на другом диске, если есть свободное место. Не связывайтесь с вещами, которые Linux (и другие программисты) ожидают определенным образом, если только это не единственный способ получить нужный вам результат.
Джо
6

Вот так:

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, которые не очищаются.

Rinzwind
источник
Это на самом деле не работает. Хотя findкоманда работает должным образом при запуске вручную, каталог все равно удаляется после редактирования /etc/init/mounted-tmp.conf. Кажется, здесь что-то еще происходит.
тердон
WTH. ЭУ. это должно означать, что 1-я строка неисправна. может быть, это должно быть относительно (?)
Rinzwind
@terdon да, кажется, это должно быть относительно / tmp /
Rinzwind
Я так не думаю, я пробовал различные перестановки, в том числе -path ./fooи даже, -name '*foo*'и ни одна из них не работала (на Ubuntu Server 14.04). Я думаю, что это просто не тот файл, и мы ищем не в том месте. То, что вы предлагаете, должно сработать, просто не похоже.
тердон
0

Это плохая идея иметь файлы с будущим значением, записывать в каталог / tmp (лучше использовать / var / tmp, как предлагают другие). Тем не менее, вы можете попробовать выстрелить в чаттр. Это должно быть выполнено после выхода из приложения, но до завершения работы. Помните, что эта операция не позволит ничего писать в этот каталог впредь.

Нажмите /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Прыгающий кролик
источник
Как это будет полезно, если я хочу иметь временный каталог?
simbabque
-1

Запустите это:

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
Даниил
источник
Ubuntu версии 14 не использует /etc/inittab. Это четко и недвусмысленно указано на его странице руководства.
JdeBP
* facepalm * Извините @JdeBP, это то, что происходит со мной после манипулирования 4 различными версиями linux. Он может поместить код куда-то, указанный в askubuntu.com/questions/34308/where-is-inittab-file
Даниэль