“Cp” açık dosyaları nasıl işler?


15

İki ayrı dizinim var. Kullanıcı ilk dosyaya bir dosya yükler. Arka planda çalışan ve dosyaları her 5 dakikada bir ikinci dizine kopyalayan bir cronjob var.

Kullanıcı yüklemesini tamamlamazsa ve cronjob dosyaları kopyalarsa ne olur? İki dizin farklı kullanıcılara aittir, cronjob kök olarak gerçekleştirilir.


bu durumda ne olacağını görmek için lütfen bu yazıyı okuyun
Serge

Teşekkürler, yazdığınız iyi yazı. Ama sorum daha çok cp ile ilgili, genel olarak linux dosya işleme değil. Belki de cp dosyanın hala açık olup olmadığını kontrol eder ve kapalı veya bir şey kadar bekler.
Havalı

No. cp, dosya tamamen yüklenene kadar beklemez. Ağ aktarım hızının, dosyayı aynı ana bilgisayardaki bir konumdan diğerine kopyalamaktan daha düşük olmasını beklediğimizden, bir noktada cpgeçerli dosya sonuna ulaşacak ve kopyalamayı durduracaktır. Sorununuzun çözümü basit olabilir: önce kullanıcı dosyayı özel olarak karıştırılmış bir dosya adıyla yükler (örneğin, .(nokta karakteri) ile eklenir .) Aktarım tamamlandığında, kullanıcı orijinal adıyla yeniden adlandırır. Sonra cron işi yalnızca görünüyor dosyalar için ile başlayan olmadığını ..
Serge

Yanıtlar:


17

cpaçık dosyalar hakkında bilmiyor. Bu nedenle, ilk kullanıcı büyük dosya yüklerse ve cronjob (veya başka bir işlem) bu dosyayı kopyalamaya başlarsa, yalnızca önceden yazılmış olanı kopyalar. Bunu bu şekilde düşünebilirsiniz - cpdosya tamamlanmış olsun, diskte olanın kopyasını oluşturur. Aksi takdirde, örneğin günlük dosyalarını kopyalayamazsınız.


Teşekkürler, bilmek istediğim bu! Bundan kaçınmanın basit bir yolu var mı? CP man sayfasını kontrol ettim ama hiçbir şey bulamadım.
Havalı

Tam olarak ne yapmak için? Açık olanlar hariç tüm dosyaları kopyalamak için? Bunu yapmanın kolay bir yolu olduğunu düşünmüyorum ( fuser+ kullanan kendi betiğinizi yazmak dışında cp. Bu kopya gerçekten güvenilmez olacaktır. Örneğin metin düzenleyicide açılan herhangi bir dosyayı kopyalamayacaktır.
Krzysztof Adamski

@Stuffy, belki cronjob'ınızda açık dosyaları listeleyebilirsiniz lsof? Bunun çıktısının işlenmesi kolaydır. Açılmakta olan dosyalara (örneğin, bir örnek olarak cp) yazmak için filtre uygulayabilirsiniz .
Wojtek Rzepala

@WojtekRzepala, buna bir göz atacağım, teşekkürler. Belki cronjob tarafından yürütülen küçük bir senaryo yazacağım
Stuffy

@Stuffy: fuserBu araç tüm dosyaları göstermeyebileceğinden , kök kullanıcı tarafından çalıştırılmadığında (aynı sorun elbette) gerçekten güvenilir olmayabileceğini unutmayın.
Krzysztof Adamski

7

cpbaşka hangi programların dosyaları açmış olabileceğini bilmiyor. İçinde sihir yok cp. Unix tasarımı, zorlayıcı bir neden olmadığı sürece (çekirdeğin ihtiyacı olan zorlayıcı bir anlam) dosyalara herhangi bir kilit koymaktan kasıtlı olarak kaçınır. Bu konuda, bkz. Çıktıyı bir dosyaya yeniden yönlendirmek dosyaya kilit uyguluyor mu?

Bir dosyanın bir yapımcı tarafından üretildiği ve tamamlandığında bir tüketici tarafından tüketildiği bu tür durumlar yaygındır. Bunu yapmanın olağan yolu, üreticinin tüketicinin aramayacağı geçici bir dosya yazmasını sağlamaktır, daha sonra üretici bittikten sonra dosyayı tüketicinin bulacağı bir yere taşıyın. Bir dosyayı (aynı dosya sisteminde) taşımak atomik bir işlemdir: bir noktada, tüketici için, dosya orada olmamaktan orada olmaya değişir.

Bu nedenle, yükleme işinizi, yükleme işlemi tamamlandığında dosyaları farklı bir dizine taşıyacak şekilde ayarlayın. Cron işini bu farklı dizine yönlendirin.


6

Dir senkronizasyon işi yapmak istediğiniz anlaşılıyor.

Çünkü -u, --update seçeneğicp

yalnızca SOURCE dosyası hedef dosyadan daha yeni olduğunda veya hedef dosya eksik olduğunda kopyala

Böylece cp -auv SOURCEDIR/* DESTDIR, değiştirme zamanı değişen dosyaları kopyalayacak bir cronjob ekleyebilirsiniz . Bu DESTDIR, yükleme tamamlandığında sonunda tam kopyayı alacağı anlamına gelir .

rsyncaynı işi yapabilir. ör rsync -av SOURCEDIR/ DESTDIR.

-A seçeneği uygulansa da, bazı belirtilen öznitelikler (ör. Sahiplik) yalnızca süper kullanıcı tarafından korunabilir.

Bkz man cp, man rsyncdetaylar için.


Sadece hedef klasördeki son girişlere güvenmeye dikkat edin --- tam dosyalar olmayabilir.
dubiousjim
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.