гарантовано існування / tmp?


42

Чи потрібно перевіряти та створювати, /tmpперш ніж записати у файл всередині нього? Припустимо, що ніхто не бігав, sudo rm -rf /tmpбо це дуже рідкісний випадок


16
Що ви маєте на увазі під «гарантованим»? FHS цього вимагає, тому будь-який дистрибутив, сумісний з FHS, мав би це. Однак існує багато дистрибуторів спеціального призначення, які не відповідають FHS. Безумовно, можна створити дистрибутив Unix / Linux без / tmp, але чи потрібно вам це подбати повністю, залежить від того, чи дбаєте ви про підтримку цих систем.
Лежати Райан

1
Чому б не створити власний тимчасовий редактор і видалити його, коли ви закінчите з ним, а не покладатися на наступну перезавантаження для очищення?
WGroleau

4
@WGroleau Я не знаю про OP, але в сценаріях, які я пишу для власної системи, я зазвичай поміщаю тимчасові файли в підкаталог /tmp(створений за допомогою mktemp), після чого видаляю цей підкаталог при виході. Більшість моєї системи встановлено лише для читання, і це перешкоджає мені запам’ятовувати cdкаталог, який можна записати
Fox

1
@WGroleau Я не покладаюся на перезавантаження, щоб очистити його. як mktempвиглядає дійсно здорово, I'l , ймовірно , закінчиться з допомогою цього.
Аюш

7
@jamesqf Так, перезавантаження не потрібно для очищення /tmp. Однак, навпаки, це дозволено , і, імовірно, WGroleau екстраполював занадто далеко від цього. Мій /tmpє tmpfsпроводяться в оперативній пам'яті, так що він очищений від зупинки. Але це лише деталі системи, які не гарантуються FHS. Отже, до оригінального коментаря - нерозумно покладатися на наявність чи відсутність чогось /tmpсеред чобіт.
підкреслюй_d

Відповіді:


60

У FHS мандати , які /tmpіснують, як це робить POSIX , так що ви можете розраховувати на його бути там (по крайней мере , на сумісних системах, але на самому ділі це в значній мірі гарантовано бути присутнім на Unix-подібних системах). Але не слід: системний адміністратор або користувач можуть віддавати перевагу іншим місцям для тимчасових файлів. Детальнішу інформацію див. У розділі Пошук правильного tmp dir на кількох платформах .


Це, звичайно, недолік дизайну. /tmp- це ім'я. $TMPDIRінша назва. Якщо ви не можете розраховувати на /tmpте, що це правильне ім'я тимчасового каталогу, то чому ви можете розраховувати на $TMPDIRте, щоб бути ім'ям змінної правильної середовища? Чому я не повинен перевірити, $TMPDIRVARщоб отримати ім'я цієї змінної? Одного рівня непрямості достатньо, і /tmpсаме це. Це не говорить нічого про власне сховище, це лише назва.
MSalters

@MSalters є трохи більше, ніж це. Перед просторами імен $TMPDIRдозволено кожному користувачеві мати окремий тимчасовий каталог або навіть використовувати різні тимчасові каталоги для різних програм; жоден /tmpне забезпечує цього (знову ж таки, без просторів імен чи чогось подібного). Тут також слід врахувати багато історії (або спадщини).
Стівен Кітт

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

44

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

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

У сценарії оболонки ви можете використовувати "${TMPDIR:-/tmp}"як тимчасове розташування файлу: це розширюється до значення, TMPDIRякщо воно встановлено¹, і до /tmpіншого. Або ви можете встановити TMPDIRумовно, якщо він не встановлений, за допомогою команди

: "${TMPDIR:=/tmp}"

а потім створити тимчасові файли всередині "$TMPDIR".

Зауважте, що будь-яка програма може створювати файли під /tmpабо $TMPDIR. Крім того, цей каталог може бути спільним для користувачів, тому вам потрібно подбати про дозволи, створюючи файл. У багатьох системах (Linux, * BSD) є команда, mktempяка безпечно створює файли в потрібному каталозі. Зазвичай це гарна ідея використовувати mktempдля створення тимчасових файлів і каталогів - особливо з скрипту оболонки, де неможливо надійно створити файл у спільному каталозі через можливість атаки символьних посилань ( mkdirце добре, якщо ви обробляєте помилки правильно).

¹ і не порожній - якщо змінна порожня, то вона не може бути використана як і в будь-якому випадку, і, як правило, хороша ідея трактувати порожні або невстановлені змінні таким же чином, якщо вони повинні містити ім'я файлу.


11
Можливо, ви могли б згадати, що користувачі повинні очікувати зіткнень з іменами файлів. Отже, IMO - єдиний рекомендований спосіб створення файлів у / tmp - це команда, mktempі це також має автоматично обробляти $ TMPDIR "
rudimeier

Це потрібна відповідь. Я бачив системи без / бін, а не / tmp.
Джошуа

1
Також структура A.10 каталогів та пристроїв зазначає: ... /tmpКаталог зберігається в POSIX.1-2008 для розміщення історичних програм, які передбачають його наявність. Реалізації пропонується забезпечити відповідні імена каталогів у змінній оточення, TMPDIRа додаткам рекомендується використовувати вміст TMPDIRдля створення тимчасових файлів. ...
Ендрю Генле

3
Сумно виявити, що mktempйого немає в POSIX, хоча це вже в більшості популярних операційних систем, таких як GNU (Linux) , OpenBSD , FreeBSD та macOS .
Франклін Ю

1
Можливо, варто додати, що mktempподібні функції доступні у багатьох мовах сценаріїв та програмувань, таких як libc , Perl та Python .
Гаурав

6

Хоча це дуже ймовірно, ви повинні перевірити з іншої причини: це не гарантовано буде великим . У багатьох системах /tmpпідтримується оперативна пам’ять, а не диск, і, ймовірно, обмежується кількома ГБ. (У системах Fedora за замовчуванням це половина оперативної пам’яті.) Отже, ви повинні перевірити не лише наявність, а чи є місце, щоб розмістити все, що ви хочете туди помістити.

Якщо у вас є щось велике, використовуйте /var/tmp/.


2
Я не впевнений, чи це "спосіб Unix", щоб перевірити наявний простір, перш ніж продовжувати, тим більше, що не завжди точно відомо, скільки місця вам знадобиться. У будь-якому випадку, ви повинні бути готові виправити помилку запису вишукано, якщо файлова система має стати повною; і якщо ви збираєтесь це робити, то що ви отримуєте заздалегідь перевірку, яка буде схильна до помилкових негативів та позитивів?
Нейт Елдредж

2
Думаю, залежить, наскільки витончено ви зможете впоратися із випадком відмови. Основний момент - не припускати, що /tmpможе обробляти великі файли. Скажімо, це завантаження 10 Гб через посилання середньої швидкості. "Unix шлях" чи ні, досить жалюгідно з'ясувати кілька годин, що це не вийде.
mattdm

1
@mattdm Перевірка на ранньому етапі - це приємно, але невдача повинна бути вирішена. Можливо, / tmp у вас є 10 ГБ, коли завантаження починається, але інший користувач копіює туди 5 Гб, поки завантаження завантажується. Тепер що? Хе.
Зан Лінкс

Безумовно! Я не розумію це як привід для того, щоб не впоратися з невдачею.
mattdm

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