/ tmp'nin var olduğu garanti edilir mi?


42

/tmpİçindeki bir dosyaya yazmadan önce kontrol etmem ve oluşturmam gerekir mi? Kimsenin kaçmadığını varsayalım sudo rm -rf /tmpçünkü bu çok nadir bir durum


16
"Garantili" ile ne demek istiyorsun? FHS bunu gerektirir, bu yüzden FHS uyumlu herhangi bir dağıtım buna sahip olacaktı. Bununla birlikte, FHS uyumlu olmayan birçok özel amaç dağıtımları vardır. / Tmp'siz bir Unix / Linux dağıtımı oluşturmak kesinlikle mümkün, ancak bununla ilgilenip ilgilenmemeniz tamamen bu sistemleri desteklemeyi umursamanıza bağlı.
Lie Ryan,

1
Neden kendi geçici dir'inizi oluşturup temizlemek için bir sonraki yeniden başlatmaya güvenmek yerine işiniz bittiğinde silmiyorsunuz?
WGroleau

4
@WGroleau OP hakkında bir bilgim yok, ancak kendi sistemim için yazdığım komut dosyalarına genellikle geçici dosyaları /tmp(ile oluşturulmuş mktemp) alt dizinine koyar, sonra çıkışta bu alt dizini kaldırırım. Sistemimin çoğu salt okunur olarak monte edildi ve bu beni cdyazılabilir bir dizine hatırlamak zorunda kalmamı engelliyor
Fox

1
@WGroleau Temizlemek için yeniden başlatmaya güvenmiyorum. mktempgörünüyor gerçekten büyük, i'l muhtemelen kullanarak sonunda.
Ayush

7
@jamesqf Evet, yeniden başlatmak için temizlemek gerekmez/tmp . Ancak, tam tersi, bunu yapmasına izin verilir ve muhtemelen WGroleau bundan çok uzak tahmin edildi. Benim /tmpbir olduğu tmpfso kapatma üzerine temizlenmezse bu yüzden, RAM düzenlenen. Yine de, bu FHS tarafından garanti edilmeyen sistemin bir detayı. Bu nedenle, orijinal yorumda, botlar arasında bir şeyin varlığına veya yokluğuna güvenmek aptalca bir şey /tmp.
underscore_d

Yanıtlar:


60

FHS görev /tmpvar gibi yapar POSIX sen onun orada olmak güvenebilirsiniz böylece (uyumlu sistemlerde en az; ama gerçekten oldukça fazla Unix benzeri sistemlerde mevcut olması garantili). Ancak şunları yapmamalısınız: sistem yöneticisi veya kullanıcı geçici dosyalar için diğer konumları tercih edebilir. Daha fazla ayrıntı için bkz. Birden çok platformda doğru tmp dir'yi bulma .


Bu elbette bir tasarım hatasıdır. /tmpbir isimdir. $TMPDIRbaşka bir isim. Güvenebileceğiniz yapamıyorsanız /tmpgeçici dizinin doğru isim olma, neden güvenebilirsiniz $TMPDIRsağ ortam değişkeninin adını olmak? Neden bu değişkenin $TMPDIRVARadını kontrol etmemeliyim ? Bir dolaylı seviye yeterlidir ve aynen öyle. Gerçek depolama hakkında hiçbir şey söylemez, sadece bir isimdir. /tmp
MSalters

@ MSalters bundan biraz daha fazlası var. Ad alanlarından önce, $TMPDIRher kullanıcının ayrı bir geçici dizine sahip olmasına ya da farklı programlar için farklı geçici dizinler kullanmasına izin verin; bir tek /tmpbunu sağlamaz (yine, isim alanları veya benzeri bir şey olmadan). Göz önünde bulundurulması gereken çok sayıda tarih (veya eski) vardır.
Stephen Kitt

Kullanıcı başına geçerli bir nokta, ancak bu yüzden iyi bir tasarım bunun ~/tmpiçin kullanır. /tmpTabii ki hala aynı fiziksel konum olabilir .
MSalters

44

Uygulamada, var /tmpolduğu hemen hemen garantilidir. Ancak, var olsa bile, bu geçici dosyaları oraya koymanız gerektiği anlamına gelmez.

Standart kongre kullanmaktır TMPDIRortam değişkeni. Varsa, geçici dosyalar için bir dizine işaret eder. Eğer yoksa, geçici dosyaları içine koyun /tmp.

Bir kabuk betiğinde "${TMPDIR:-/tmp}"geçici dosya konumu olarak kullanabilirsiniz : bu, TMPDIRayarlanmışsa değerine ve /tmpaksi takdirde de genişler . Veya TMPDIRayarlanmamışsa, komutla koşullu olarak ayarlayabilirsiniz

: "${TMPDIR:=/tmp}"

ve sonra içinde geçici dosyalar oluşturun "$TMPDIR".

Herhangi bir uygulamanın /tmpveya altında dosya oluşturabileceğini unutmayın $TMPDIR. Ayrıca bu dizin kullanıcılar arasında paylaşılabilir, bu nedenle bir dosya oluştururken izinlere dikkat etmeniz gerekir. Birçok sistemde (Linux, * BSD) mktempdoğru dizinde güvenli bir şekilde dosya oluşturan bir komut vardır. mktempGeçici dosyalar ve dizinler oluşturmak için kullanmak genellikle iyi bir fikirdir - özellikle bir kabuk betiğinden, paylaşılan bir dizinde güvenli bir dosya oluşturmak mümkün olmaz mkdir.

¹ ve boş değil - değişken boşsa, o zaman zaten olduğu gibi kullanılamaz ve bir dosya adı içermesi gerekiyorsa, boş ya da ayarlanmamış değişkenleri aynı şekilde ele almak iyi bir fikirdir.


11
Belki de kullanıcıların dosya adı çakışmalarını beklemeleri gerektiğini söyleyebilirsiniz. Yani IMO / tmp içinde dosya oluşturmanın tek önerilen yolu komuttur mktempve bunun da $ TMPDIR "i otomatik olarak işlemesi gerekir.
rudimeier

İstediğiniz cevap bu. / Bin olmadan / tmp olmadan sistemleri gördüm.
Joshua

1
Ayrıca A.10 Dizin Yapısı ve Aygıtları şunları belirtir: ... /tmpDizin, kullanılabilirliğini varsayan geçmiş uygulamaları barındırmak için POSIX.1-2008'de saklanır. Uygulamaların ortam değişkeninde uygun dizin isimleri sağlaması teşvik edilir TMPDIRve uygulamaların TMPDIRgeçici dosyalar oluşturmak için içeriğini kullanmaları teşvik edilir . ...
Andrew Henle

3
GNU (Linux) , OpenBSD , FreeBSD ve macOSmktemp gibi en popüler işletim sistemlerinde olmasına rağmen, POSIX'de olmadığını bulmak üzücü .
Franklin Yu,

1
Bu mktempgibi fonksiyonlar libc , Perl ve Python gibi birçok betik ve programlama dilinde mevcuttur .
Gaurav

6

Var olma olasılığı çok yüksek olsa da, başka bir nedene bakmalısınız: büyük olduğu garanti edilmez . Pek çok sistemde, /tmpdisk yerine RAM tarafından desteklenir ve muhtemelen birkaç GB ile sınırlıdır. (Fedora sistemlerinde, varsayılan olarak RAM'in yarısıdır.) Bu nedenle, yalnızca var olup olmadığını kontrol etmemelisiniz, aynı zamanda oraya koymak istediğiniz şeyi koyacak yer olup olmadığını da kontrol etmelisiniz.

Büyük bir şey varsa, kullanın /var/tmp/.


2
Devam etmeden önce kullanılabilir alanı kontrol etmenin "Unix yolu" olup olmadığından emin değilim, özellikle her zaman tam olarak ne kadar alana ihtiyaç duyacağınız bilinmediğinden. Her durumda, dosya sisteminin dolması durumunda, yazma hatasını dikkatlice işlemeye hazırlıklı olmalısınız; ve eğer bunu yapacaksanız, yanlış negatiflere ve pozitiflere eğilimli olacak bir ön kontrol yaparak ne kazanılır?
Nate Eldredge,

2
Başarısızlık olayını ne kadar zarif bir şekilde idare edebileceğine bağlı. Asıl nokta, /tmpbüyük dosyaları işleyebileceğini varsaymamaktır . Diyelim ki ılımlı bir bağlantı üzerinden 10 GB'lık bir indirme. "Unix yolu" ya da değil, işe yaramayacağının birkaç saatini öğrenmek oldukça perişan.
mattdm

1
@ mattdm Erken kontrol güzel ama başarısızlık ele alınmalı. Belki de / tmp indirme başladığında 10 GB'lık kapasiteye sahip fakat başka bir kullanıcı indirme işleminiz devam ederken oraya 5 GB kopyalıyor. Şimdi ne olacak? Heh.
Zan Lynx

Kesinlikle! Bunu başarısızlıkla başa çıkmamak için bir bahane olarak kastetmiyorum.
mattdm

"Büyük bir şey varsa" - / tmp kullanın ve gerekirse işletim sisteminin değişmesine izin verin.
UKMonkey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.