RAM'de geçici bir dosya nasıl yapılır?


29

Çıktısını yönlendirecek bir senaryom var |tee scriptnameYYMMDD.txt. Çıktının oluşturulduğu for döngüsünün her döngüsünden sonra, dosya içeriğini tersine çevireceğim, tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txtböylece log çıktısı en yeni satırların bulunduğu tarayıcı penceresinde görülebilir.

Paralel olarak bunu yapan birkaç senaryo var. Disk etkinliğini en aza indirmeye çalışıyorum, bu yüzden |tee scriptnameYYYYMMDD.txtRAMDisk'ten çıktı en iyisi olacaktır. klasörde mktempbir dosya oluşturur /tmp, ancak diskte görünmüyor.


Bir ramfs veya bir tmpfs olması gerekiyor (ikincisi daha iyi). Böyle bir fs'nin sisteminize zaten monte edilmiş olup olmadığını kontrol edin, evet ise bunu kullanabilirsiniz. Hayır ise, monte etmeniz gerekir.
peterh, Monica

fstabBir tmpfsüzerine monte etmek /tmpve makineyi yeniden başlatmak için güncelleme yapardım .
kasperd

1
Eğer adım adım düşünebilirsiniz taildosyaları ing (veya istek ya da bir şey üzerine CGI yoluyla başlatılması) yerine tacher şeyi ing.
mikeserv 6'15

Bu testte işe yarıyor gibi görünüyor (azalmış formatlama için üzgünüm): TEMPPATH="/ramdisk" LOGPATH="/var/www/html/log" ... echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt ... döngü cp $TEMPPATH/moveKRT$(date '+%Y%m%d').txt $LOGPATH/moveKRT$(date '+%Y%m%d').txt tac $TEMPPATH/moveKRT$(date '+%Y%m%d').txt > $LOGPATH/moveKRT.txt sonunda, minicik ihtimalin 23: 59: 59.999 ile 00:00 arasında değişebileceğinin farkındayım: 00 bazı dosyaları etkileyebilir, ancak şans kabul edilebilir.
user208145

Bu konudaki ilerlememe dair güncelleme: / ramdisk'te 1 GB tmpfs birimim var. FTP ile kullanıcı ana klasörlerine giren dosyalarım var. İşlemek için bir alt klasöre / ramdisk / queues / xyz / dizinine taşınır ve sonra silinir. Başlangıçta, gerekli dizin yapısını / ramdisk altında yeniden yaratan bir betiğim var. Bu, gelen dosyalar için minimum disk etkinliği ile sonuçlanmalıdır. Şimdiye kadar bu betikler için disk G / Ç'lerini azaltmanın tek yolu, bu klasörleri başlangıçta oluşturulmuş bir tmpf içinde, bu dosyalar FTP yoluyla bu kullanıcı klasörlerine gelmeden önce oluşturmak olacaktır. Herkese teşekkürler.
user208145 19:15

Yanıtlar:


22

Bir tmpfspartiti kurabilir ve dosyayı buraya yazabilirsiniz:

mount -t tmpfs -o size=500m tmpfs /mountpoint

Bu bölüm şimdi 500 MB ile sınırlıdır. Geçici dosya daha büyük 500 MB büyürse bir hata oluşacaktır: no space left on device. Ancak, sisteminizin RAM'inden daha büyük bir alan belirlediğinizde farketmez. tmpfstakas alanını da kullanır, bu nedenle bir sistem çökmesine zorlayamazsınız ramfs.

Şimdi dosyanızı aşağıdakilere yazabilirsiniz /mountpoint:

command | tee /mountpoint/scriptnameYYYYMMDD.txt

3
size=[num]%ayrıca iyidir - bir tmpfs kullanılabilir bir hafıza yüzdesiyle sınırlandırılabilir. Komutlar aynı (gerçek / sanal) makine için her zaman hedeflenmemişse, genellikle bu şekilde daha kolaydır . Ayrıca kullanışlı bir tmpfs içeriği w / w ile bırakmaz -o remount,size=newsize.
mikeserv 6'15

1
Kökünü tarafından çalıştırılan varsaymak için hiçbir neden yok bir bash betiği etrafında soru dönmektedir, bu yana, bir çevrede alabilir belirtebilirsiniz mountroot olmayan kullanıcıların kullanımına izin vermeyen -tveya -o? Diğer bir deyişle, tmpfssistemde uygun bir dosya sistemi yoksa, disk işlemlerinden tasarruf etmek için (ya da başka herhangi bir şekilde RAM kullanan) bir komut dosyası nasıl oluşturulabilir ?
Jonathan Y.,

İyi bir cevap değil. Kök değilseniz, başarısız olur.
Alex

11

Bunu Ubuntu ile deneyin:

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"

3
yazma ne kadar kararlı /run/shm/? chmodGerekirse geçici dosyaya değişiklikler uygulayabilir miyim ? Klasörün mod bitlerinin /tmpklasörle aynı olduğunu fark ettim . Teşekkürler.
user208145

1
Diğer dizinlere gelince /run/shm(symlink to /dev/shm) ' mktempda oluşturulan dosyalar da -rw-------(600)' ün varsayılan iznine sahiptir ve gerektiğinde değiştirebilirsiniz sudo chmod.
KrisWebDev

9

Aşağıdaki cevap, önceki cevapları ve bu sorudaki bilgiyi burada araştırarak keşfedildi ve onlarsız bulunamadı. Onlara cudos.

Linuxmint sistemimde (ve çoğu ubuntu tabanlı sistemler ve muhtemelen debian tabanlı sistemler olduğunu varsayardım) otomatik olarak tmpf'lerin takıldığı bir kullanıcı var. /run/user/1000/

df -TKontrol etmek için kullanın .

11:41:11 jesse @ Limbo: ~ $ df -T
Dosya Sistemi Türü 1K-blokları Kullanılmış Mevcut Kullanım Yüzdesi
udev devtmpfs 15904812 4 15904808 1% / dev
tmpfs tmpfs 3184120 1700 3182420 1% / çalışma
/ dev / sdb2 ext4 14248880 11464788 2037240 85% /
none tmpfs 4 0 4 0% / sys / fs / cgroup
none tmpfs 5120 0 5120 0% / run / lock
none tmpfs 15920584 848 15919736 1% / run / shm
none tmpfs 102400 12 102388 1% / run / kullanıcı
/ dev / sdb3 ext4 100861352 90755700 4959136% 95 / mnt / veri

Altında /run/user/sistemdeki her normal kullanıcı için bir dizin var.

12:07:35 jesse@Limbo:~$ ls -l /run/user
total 0
drwx------ 2 root  root   40 Aug  7 09:50 0
drwx------ 8 jesse jesse 180 Aug  7 11:38 1000

Bu dizinler ilgili kullanıcı adlarından sonra adlandırılır. Bu komutun detaylarını id -ugörmek man idiçin kullanıcı kimliğini görebiliriz .

12:07:43 jesse@Limbo:~$ ls -l /run/user/$(id -u)
total 0
drwx------ 2 jesse jesse  60 Aug  7 09:50 dconf
dr-x------ 2 jesse jesse   0 Aug  7 09:50 gvfs
drwx------ 2 jesse jesse  80 Aug  7 09:50 pulse
lrwxrwxrwx 1 root  root   17 Aug  7 09:50 X11-display -> /tmp/.X11-unix/X0

Bu temp mktempkomutunu --tmpdir, bu tempfilesystem içerisinde temp dosyaları ve dizinleri oluşturma seçeneği ile kullanabiliriz, böylece RAM'de tempfiles oluşturabiliriz.

Burada verilen tavsiyelere göre, önce bir temp dizini yarattım, sonra buradaki temp dosyalarını oluşturdum:

mydir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u))

geçici bir dizin oluşturmak için /run/user/1000/bash.w42BYxbG/daha sonra

myfile=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=$mydir)

İçinde bir tempfile oluşturmak için.

Yapmam gereken tek şey bu dosyayı temizlemeyi kolaylaştırıyor rm -r $mydir.

Varsayılan olarak, tüm bu dosyalar yalnızca onları oluşturan kullanıcı tarafından aittir ve okunabilir.

Not: $(basename $0)Komutun kısmı, mktemp'yi çalıştıran komut dosyası / işlemin adını çıkarır. Eğer bir betiğim varsa, /home/jesse/scripts/myScript.sho zaman bu betiği tarafından çalıştırıldığında $(basename $0)döner myScript.sh. Böylece yukarıdaki komutlar /run/user/1000/myScript.sh.w42BYxbG/ve /run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06sırasıyla oluşturacaktı .


/run/user/1000systemd kullanan her linux'ta bulunur, bu nedenle yalnızca debian tabanlı sistemlerde değil, diğer linux dağıtımlarında da kullanılabilir. Değilse, / tmp yerine kullanılmalıdır. Her kullanıcı için doğru dizini zaten tutan $ XDG_RUNTIME_DIR değişkenini kullanarak komutlarınızı basitleştirebilirsiniz. Daha fazla bilgi için, örneğin şu cevabı kontrol edin: unix.stackexchange.com/questions/162900/…
Alex

1
Mktst yerine mkstemp kullanın! Sebep: linux.die.net/man/3/mktemp : Bugs bölümünde "... mktemp () 'nin her kullanımının bir güvenlik riski olduğu, mkstemp (3)' ten yarıştan kaçınıldığı bildirildi.
Alex

0

Anladığım kadarıyla, hedefler şunlardır: (1) do tarayıcısına sunulması gereken, diske ters dosyasını depolamak (not: bu bütün olarak, vs, diğer cevaplar zaten detay tmpfs olabilir); ancak, (2) ilk tmp dosyasını orijinal çıktıyla diske yazmaktan kaçının; ve yine de, (3) hala orijinal çıktıyı stdout'a gösteriyor.

Eğer öyleyse, o zaman aşağıdakiler bash proses ornatımını kullanarak (yani temel olarak adlandırılmış bir boru) ihtiyaçlarınızı karşılayabilir :

command | tee >( tac > /var/www/html/logs/scriptname.txt )

Bunun sürekli çıktıyı stdout'a yazdırdığını ve komut sona erdiğinde (döngü sona erdiğinde), bu çıktıyı tersine çevirir ve çıktı dosyasına yazar. Saniyede bir satır basan ve sonlandırıldıktan sonra dosya /tmp/foo.txtters çevrilmiş satırları içeren, aşağıdakilerle gösterilmiştir

i=0
while [ $i -lt 10 ]; do
    ((i = i+1))
    echo "==$i== $(date)"
    sleep 1
done | tee >( tac >> /tmp/foo.txt ) 
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.