Як запобігти очищенню папки всередині / tmp?


12

Це питання стосується Ubuntu 14.10 на моєму ноутбуці розробника.

У мене папка, /tmpяка використовується програмою для розміщення тимчасових речей. Цей додаток зазвичай робить тимчасову папку в моєму hededir та видаляє її згодом. Чомусь це не працює, коли хомедір зашифрований. Тому замість цього я зробив симпосилання до /tmp/fooсвого домашнього готеля. Моя заявка може написати там і зробити це тимчасовою підпапкою.

Тепер /tmp/fooвидаляється щоразу, коли я перезавантажую машину. До цих пір я просто відтворив папку вручну після перезавантаження. Тепер я дізнався, як очищується каталог / tmp? що там роблять роботу.

Я переглянув, /etc/init/mounted-tmp.confале мого башфу, а особливо моєї знахідки, недостатньо для того, щоб робити те, що я хочу. Ось уривок із цього файлу:

   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себе. Як це зробити?


Це /tmp/fooкаталог чи файл?
terdon

Довідник. Всередині є файли.
simbabque

Чому не додати mkdir /tmp/fooпрямо раніше end script?
Хаген фон Ейтцен

Просто FYI (ви вже можете це знати): 14.10 досягає EOL в липні 2015 року, тож вам слід реально перейти до Vivid якомога швидше.
Léo Lam

Відповіді:


20

/etc/init/mounted-tmp.confє частиною mountallпакету, тому будь-які оновлення цього пакета та запропоновані зміни будуть повернені.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Натомість, згідно зі стандартом ієрахії Filesystem (FHS) ;

Щодо / tmp :

Програми не повинні припускати, що будь-які файли чи каталоги в / tmp зберігаються між викликами програми.

Щодо / var / tmp :

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

Тому вам слід змінити своє символічне посилання, щоб використовувати /var/tmpзамість цього /tmp.


3
Класичний приклад, коли у тебе є молоток, все виглядає як цвях.
WernerCD

@WernerCD Ви могли б пояснити, що ви маєте на увазі під цим? Ти кажеш, що /var/tmpце не гарна ідея?
simbabque

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-але-не-зовсім -tmp речі. / var / tmp ПОТРІБНО зберігати між перезавантаженнями, тому це правильна відповідь.
WernerCD

8

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

Однак я часто займаюся тим, щоб створити собі папку під / вибрати для зберігання випадкових речей, які я не хочу вдома. Це підходяще місце для розміщення речей, які перебувають поза контролем ОС.


Це правильна ідея. Якщо / 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-файли, які не очищені.


Це насправді не працює. Хоча findкоманда працює, як очікувалося, при запуску вручну, каталог все-таки видаляється після редагування /etc/init/mounted-tmp.conf. Здається, тут щось інше відбувається.
terdon

wth. ем. це повинно означати, що 1-й рядок несправний. можливо, це має бути відносним (?)
Rinzwind

@terdon так здається, це має бути відносно / tmp /
Rinzwind

Я не думаю, що я спробував різні перестановки, в тому числі -path ./fooі навіть, -name '*foo*'і жодна з них не працювала (на Ubuntu Server 14.04). Я думаю, що це просто не правильний файл, і ми шукаємо в неправильному місці. Те, що ви пропонуєте, має спрацювати, але, схоже, це не так.
тердон

0

Дуже погано мати файли з майбутнім значенням, писати в каталог / tmp (/ var / tmp, як пропонують інші, є кращим місцем). Це означає, що ви можете поцілити в chattr. Це потрібно запустити після закінчення програми, але перед відключенням. Пам'ятайте, що ця операція надалі нічого не дозволяє записувати в цей каталог.

торкніться /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

Версія 14 Ubuntu не використовується /etc/inittab. Це чітко і однозначно зазначено на його сторінці керівництва.
JdeBP

* facepalm * Вибачте @JdeBP, ось що трапляється зі мною після жонглювання 4 різними версіями Linux. Він може поставити код кудись вказано askubuntu.com/questions/34308/where-is-inittab-file
Даніель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.