Bir günlük programı silinmiş bir dosyaya günlüğe kaydetmeye nasıl devam edebilir?


12

Gönderen Unix güç araçları, 3rd Edition : yerine Dosyasını Kaldırma arasında It boşaltın bölümü:

Etkin bir işlemde dosya açıksa (günlük dosyaları için nadir değildir), dosyayı kaldırmak ve yeni bir işlem oluşturmak günlük programını etkilemez; bu iletiler artık bağlı olmayan dosyaya gitmeye devam edecek . Dosyayı boşaltmak ilişkilendirmeyi bozmaz ve bu nedenle günlük kayıt programını etkilemeden dosyayı temizler.

( benimkini vurgula )

Bir programın neden silinmiş bir dosyada oturum açmaya devam edeceğini anlamıyorum. Dosya tanımlayıcı girdisinin işlem tablosundan kaldırılmaması nedeniyle mi?

Yanıtlar:


11

Bir dosyayı sildiğinizde, dosyanın bağlantısını (inode) gerçekten kaldırırsınız. Birisi bu dosyayı zaten açıksa, sahip olduğu dosya tanımlayıcısını korur. Dosya diskte kalır, yer kaplar ve dosyaya erişiminiz varsa bu dosyaya yazılabilir ve dosyadan okunabilir.

unlinkFonksiyon POSIX tarafından bu davranışı ile tanımlanır:

Dosyanın bağlantı sayısı 0 olduğunda ve hiçbir işlem dosya açılmadığında, dosyanın kapladığı alan serbest bırakılır ve dosyaya artık erişilemez. Son bağlantı kaldırıldığında bir veya daha fazla işlemin dosyası açıksa, bağlantı unlink () döndürülmeden önce kaldırılır, ancak dosyaya yapılan tüm başvurular kapatılana kadar dosya içeriğinin kaldırılması ertelenir .

Bu davranış yüzünden bu tavsiye. Arka plan programı dosyayı açacak ve silindiğini fark etmeyecektir (özellikle izlemiyorsa, ki bu nadirdir). Mevcut dosya tanımlayıcısına yavaşça yazmaya devam edecek: diskte (daha fazla) yer kaplamaya devam edeceksiniz, ancak yazdığı iletileri göremeyeceksiniz, bu yüzden gerçekten en kötüsünüz her iki dünyanın. Dosyayı sıfır uzunluğa keserseniz, alan hemen boşaltılır ve yeni mesajlar, dosyanın görebileceğiniz yeni ucuna eklenir.

Sonunda, arka plan programı sona erdiğinde veya closedosyayı silerken , alan boşaltılır. Yeni kimse dosyayı bu arada açamaz ( Linux/proc/x/fd/... gibi sisteme özel yansıtıcı arabirimler dışında ). Ayrıca aşağıdakiler de garanti edilir:

Dosyanın bağlantı sayısı 0 ise, dosyayla ilişkili tüm dosya tanımlayıcıları kapatıldığında, dosyanın kapladığı alan serbest bırakılır ve dosyaya artık erişilemez.

Böylece disk alanınızı kalıcı olarak kaybetmezsiniz, ancak dosyayı silerek hiçbir şey kazanmazsınız ve yeni iletilere erişiminizi kaybedersiniz.


1
Bir kullanıcı (burada root diyelim) bağlantıyı kaldırmayı denerse ne olur /proc/x/fd/y? Bu, işlemin dosya tanımlayıcısına yazamamasına neden olur mu yoksa bu geçersiz bir işlem midir?
nanofarad

@hexafraction /proc/*/fd/*, gerçek dosyaların sembolik bağlantılarıdır, bu nedenle kaldırıldığında dosya silinmez . Denemenizi öneririm :) (tabii ki üretim sisteminde değil!)
Ruslan

1
@MichaelHomer Belki de yanıtınızda bir dosyanın bağlantısı kaldırıldığında, dosyayı gösteren bir dosya tanımlayıcıya sahip olan işlemin aynı yoldan tekrar bağlayabileceğini açıklayabilirsiniz. Bu bazen yararlı olabilir.
lgeorget

@hexafraction Bunlar sadece işlem durumunun ve nesnelerin (dosya sistemi alanında) temsilleridir. Dosya sistemi alanındaki bu gösterimleri kaldırırsanız, gerçek işlemde hiçbir şey olmamalıdır - (veya başka bir işlem), bu gösterimin orada olmasına bağlı olmadığı sürece. rmİçeride sürekli olarak /procveya /syssistem tarafından söylenmeden kullanabileceğinizden emin değilsiniz .
David Tonhofer

@lgeorget Bu nasıl yapılır?
Michael

8

Kesinlikle.

Dosyalar üç parçalıdır.

  • İçerik, yani, bir disk üzerinde bir yere yazılan veya anında üretilen düz bir bayt dizisidir.
  • Göstergesi düğümü veya düğüm veri yapısı doldurulur ve çekirdek tarafından kullanılan Short için. Dosyayla ilgili tüm meta verileri (boyut, izin vb.) İçerir ve ayrıca dosya içeriğinin konumuna işaret eder.
  • Bir veya daha fazla dizin girişleri olarak manipüle yerlerdir, yollar gibi /home/user/personal_fileonun içeriğini değiştirebilir dosyasını kullanabilirsiniz geçtiği tutamaklar gibi hareket, vb meta verilerini değiştirmek

Bir dosyayı açtığınızda, işletim sisteminin yolunu verirsiniz ve bu dosya doğrudan inode'a bir tanıtıcı döndürür. Dosya tanıtıcı adı verilen bu tanıtıcıyla, dosyayı istediğiniz gibi (veya en azından işletim sisteminin izin verdiği şekilde) değiştirebilirsiniz.

Asla doğrudan bir inode silemezsiniz, silinmesi için işletim sistemine bir yol vermeniz gerekir. Bu nedenle, bir dosyayı silmek istediğinizde, yalnızca dizin girişini silmiş olursunuz. Dosyanın başka dizin girişleri varsa, erişilebilir olmaya devam eder ve olmasa bile, ona işaret eden dosya tanımlayıcıları varken inode'u silinmez. @ MichaelHomer'ın yanıtı bu konuda daha teknik ve daha ayrıntılı.


4

Diğer 2 yanıt Aynı sorun açıklamak - buna bütün dizin bağlantılar kadar almaz bir dosya "silinmiş" ve buna tüm açık dosya tanımlayıcıları gitti.

Bundan kaçınmak için kullanmak iyi bir alışkanlıktır

> /var/log/bigfile

onun yerine

rm -f /var/log/bigfile

çünkü içeriği silmek yerine sadece 0 bayta sıfırlar ve yazdıklarınızı yine de görebilirsiniz.

Dosyayı sildiyseniz ve / proc / fd dosya sisteminizin bulunduğu linux üzerindeyseniz,

> /proc/12345/fd/3

dosyanın içeriğini sıfırlamak için (12345 işlem kimliğiniz ve 3 büyük dosyanın fd numarası olduğunu varsayarsak). Diskiniz dolu çalışıyorsa ve günlük dosyanızı herhangi bir nedenle yazan işlemi öldüremezseniz, bu bir hayat kurtarıcı olabilir.


> /var/log/bigfiledosyadaki mevcut verileri kaldırır, ancak programların buraya yazmasını durdurmaz. Doğru olanın çok az olduğu durumlar vardır. İçeri girmenin kötü bir alışkanlık olduğunu söyleyebilirim. Bir dosyayı silmek istiyorsanız tuşunu kullanın rm. Oraya yazılan programları durdurmak istiyorsanız, silmeden önce veya sonra, onları öldürün ya da yazmayı durdurun.
Gilles 'SO- kötü olmayı bırak

1
@Giles, bu konu, bir program hala dosya açıksa silme işleminin yardımcı olmayacağı gerçeğiyle ilgilidir. Ve eğer disk doluysa, bazı programlar hatalı davranır ve syslogddoldurursa /var/log/messages, > /var/log/messagesöldürmekten çok daha iyi bir seçenektir syslogd. Tabii ki, bu sorunun ilk etapta analiz edilmesini engellememelidir.
Guntram Blohm,
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.