У яку папку я повинен писати для своїх проміжних файлів як розробник?


17

Я починаю писати кілька скриптів bash для свого проекту, і їм потрібно записати проміжні файли або змінні.

Мені хочеться знати, до яких папок я можу бути впевнений у доступі, коли хтось запускає мій сценарій? Це звичайна практика використання /tmp/? Або я повинен використовувати щось інше?

Відповіді:


21

Я вважаю, що стандартний стандарт ієрархії файлів є безцінним при пошуку цього матеріалу.

Є кілька варіантів,

  • / tmp - "непостійні" тимчасові файли
  • / var / tmp - "постійні" тимчасові файли
  • / var / cache - перехідні файли даних 'application'

Це дійсно залежить від типу даних, які ви зберігаєте.


краще використовувати те, що дає вам користувач / середовище, і використовувати тільки / tmp тощо як резервний. (що сказав unix.stackexchange.com/a/79776/7784 )
Олуф Лоренцен

15

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

/tmpочищається під час завантаження в деяких системах (іноді це навіть в оперативній пам’яті, наприклад, за замовчуванням у Solaris та в деяких установах Linux), тому його не можна використовувати для файлів, які повинні пережити перерву живлення або перезавантаження. /var/tmpможна використовувати для файлів, які повинні пережити перезавантаження, але їх час від часу може очищати системний адміністратор. Якщо вашій програмі потрібно зберегти файли на постійній основі, запишіть їх десь у домашній каталог користувача (в ~/.programmingnoobsappабо ~/.cache/programmingnoobsapp) або під /var/lib/programmingnoobsappабо /var/cache/programmingnoobsapp.

Зауважте, що /tmpце спільний доступ між усіма користувачами, тому вам потрібно дотримуватися заходів безпеки під час створення файлу там. Вам потрібно вибрати ім’я файлу, яке ще не існує, і вам потрібно бути обережним, щоб не допустити перегонового стану, коли інший процес створює файл попереду вас з різними дозволами, які можуть бути отвором для безпеки (якщо інший процес працює як інший користувач, він може потім отримати доступ та змінити дані вашого процесу). Використовуйте mktempкоманду для створення файлу в /tmpабо /var/tmp. За замовчуванням mktempстворює файл у $TMPDIR, або /tmpякщо він TMPDIRне встановлений, зазвичай це правильне місце. Якщо вам потрібно використовувати кілька тимчасових файлів або навіть якщо вам потрібен один, я рекомендую створити каталог для всіх ваших тимчасових файлів за допомогоюmktemp -d та видаливши його в кінці сценарію.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt до mktemp, я не видаляю тимчасові файли наприкінці сценарію. У мене є робота cmpwatch cron, яка автоматично видаляє старі файли. У переважній більшості випадків я не читаю проміжний файл, і система видалить файли сама по собі. Однак якщо зі сценарієм щось піде не так, у мене є всі проміжні файли для легкої налагодження.
Еморі

1
+1 для mktemp. Для мене це правильна відповідь: делегуйте завдання безпечного створення тимчасового файлу mktemp(див. Цю статтю ). Хоча одна відповідь, що цитує, також FHSмає велике значення.
Карлос Кампдеррос

Чому ви ініціалізуєтесь tmp_rootперед тим, як призначити її? Хіба це не було б природніше unset?
l0b0

@ l0b0 Або буде працювати (окрім під set -u, але це нечасто). Перед встановленням пастки його потрібно (не) встановити на безпечне значення, якщо сценарій буде вбитий відразу після встановлення пастки.
Жил "ТАК - перестань бути злим"

Я додам, set -o errexitщо якщо tmp_rootв середовищі вже встановлено лише читання, воно не зруйнує неправильну директорію ...
l0b0

2

Просто для доповнення відповідей, які вже були розміщені до цих пір.

Є також /dev/shmдеякі дистрибутиви Linux, які можна використовувати для тимчасового зберігання. Це сховище слід використовувати лише тоді, коли продуктивність вводу / виводу файлів є критичним фактором, який /dev/shmвикористовує tmpfsфайлова система. Крім того, він повинен використовуватися для файлів і даних з досить великим розміром. В tmpfsфайлової дозволяє використовувати в якості системної пам'яті зберігання , так що не є постійною від завантаження до завантаження.

Ви знайдете хороший огляд усіх варіантів, згаданих тут, на StackOverflow, а також у цьому запитанні під назвою: / tmp vs. / dev / shm для зберігання тимчасових файлів в Linux? . Це добре висвітлено в цьому питанні SuperUser Q&A під назвою: Коли я повинен використовувати / dev / shm / і коли я повинен / tmp? .

Список літератури


0

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


1
Не всі каталоги / tmp очищаються під час завантаження. Наприклад, установки AIX за замовчуванням не роблять (і це UNIX та Linux, а не лише Linux).
EightBitTony

Однак якщо це резидент "пам'яті", який, як видається, у багатьох випадках за замовчуванням, він зникає, коли система зупиняється з будь-якої причини.
mdpc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.