Mümkünse, açık modunu ('>'
) okumak/yazmak yerine değiştirebilirsiniz. Ardından, dosyayı kurtarmanız gerektiğinde, gerektiğinde aynı ada sahip olsa bile, yeni açılan bir dosyaya yazdırmak için filehandle'ı kullanabilirsiniz.
open my $fh, '+>', $file;
say $fh "line 1";
unlink $file;
say $fh "more lines";
seek $fh, 0, 0;
open my $fh_rec, '>', $file or die "Can't open $file (again): $!";
print $fh_rec $_ while <$fh>;
Bu sorulur tam olarak ne değil ama dosya içeriğini ve buna erişimi kurtarır. $fh
numaralı yeni baskılar yeni $file
senkronizasyon dışında bırakılır, bu nedenle yazma işlemi bittiğinde (dosyayı geri yüklemek için) veya baskıyı $fh_rec
(daha sonra close $fh
) olarak değiştirmek için yapılabilir. o /proc
kullanır ve dosya kolları maruz bırakması halinde
bir dosyayı kurtarmak için başka bir yol, OS kullanmaktır. Daha sonra veriler /proc/PID/fd/N
'dan kopyalanabilir. N
'u tanımlamak için, fd/
(bir kaç) ls -l
ile olan tüm bağlantıları tarayabilirsiniz, çünkü silinen dosyanın adı sonra (deleted)
olmalıdır.
Ayrıca, lsof -p PID
verilen işlem için tüm açık dosya tanımlayıcılarını listeler. Silinen dosyalar için onlarla (deleted)
var. (lsof +L1 -p PID
sadece silinmiş girişleri verir, hala oldukça az.) Bu çıkıştan bu dosya tanımlayıcısını okuyabilir ve daha sonra verileri /proc/PID/fd/N
'dan kopyalayabiliriz. Bu şekilde, aynı zamanda, dosyayı kurtarmak için de kullanılabilen inode numarasını elde ederiz.
Tamamen katılıyorum, bunun için bir imkan yok ve _in general_. Bir şeyleri kaçırıp kaçırmadığımı merak ediyorum, neden "_açık dosya kütüğünden gelen içeriği açabilir ** may ** work._" (benimki)? Gönderdiğim dosya (rw) açıldığı sürece çalışır (veya - nasıl olmaz?). (Elbette orijinal bağlantıyı geri yüklemez.) – zdim
Yeniden bağlama işleminin nedeni, dosyayı yeniden okumayı engellemekse (burada benim durumumda), kopyalama içeriği çalışmaz. –
Ah, tamam. Bunun bir amaç olduğunu anlayamadım. – zdim