Saya memiliki dua direktori terpisah. Pengguna memuat file ke dalam file pertama. Ada tugas cronjob di latar belakang yang menyalin file setiap 5 menit ke direktori kedua.
Apa yang terjadi jika pengguna belum menyelesaikan unggahannya dan cronjob menyalin file? Perhatikan bahwa dua direktori dimiliki oleh pengguna yang berbeda, cronjob dilakukan sebagai root.
cp
akan menunggu sampai file diunggah sepenuhnya. Seperti yang kami perkirakan kecepatan transfer jaringan lebih rendah daripada hanya menyalin file dari satu lokasi ke lokasi lain di dalam host yang sama, maka pada titik tertentucp
akan mencapai akhir file saat ini dan akan berhenti menyalin. Solusi untuk masalah Anda dapat dengan sederhana: pertama pengguna mengunggah file dengan beberapa nama file yang rusak (misalnya diawali dengan.
(karakter dot) .Ketika transfer dilakukan pengguna mengubah nama menjadi nama asli. Kemudian pekerjaan cron hanya terlihat untuk file yang tidak dimulai dengan.
Jawaban:
cp
tidak tahu tentang file yang dibuka. Jadi, jika pengguna pertama mengunggah file besar dan cronjob (atau proses lainnya) mulai menyalin file ini, itu hanya akan menyalin sebanyak yang sudah ditulis. Anda dapat memikirkan hal ini dengan cara ini -cp
membuat salinan dari apa yang saat ini ada di disk, tidak masalah jika file tersebut selesai. Jika tidak, Anda tidak dapat menyalin file log misalnya.sumber
fuser
+cp
. Salinan seperti itu akan sangat tidak dapat diandalkan. Ini tidak akan menyalin file yang dibuka di editor teks misalnya.lsof
? Output dari itu dimaksudkan agar mudah diproses. Anda dapat memfilter file yang sedang dibuka (misalnya, olehcp
) untuk menulis.fuser
tentu saja) karena alat ini mungkin tidak menampilkan semua file.cp
tidak tahu program apa yang mungkin membuat file terbuka. Tidak ada keajaiban di dalamnyacp
. Desain unix sengaja menghindari meletakkan segala jenis kunci pada file kecuali ada alasan kuat (meyakinkan bahwa kernel membutuhkannya). Pada topik ini, lihat Apakah mengarahkan output ke file menerapkan kunci pada file?Situasi seperti itu, di mana file diproduksi oleh produsen dan, setelah selesai, dikonsumsi oleh konsumen, adalah hal biasa. Cara biasa untuk menangani ini adalah membuat produser menulis file sementara yang tidak akan dicari konsumen, kemudian setelah produser selesai memindahkan file ke tempat di mana konsumen akan menemukannya. Memindahkan file (pada sistem file yang sama) adalah operasi atom: pada titik tertentu, bagi konsumen, file berubah dari tidak ada di sana menjadi ada di sana.
Jadi atur pekerjaan unggahan Anda untuk memindahkan file ke direktori lain ketika selesai melakukan unggahan. Arahkan pekerjaan cron di direktori yang berbeda ini.
sumber
Sepertinya Anda ingin melakukan pekerjaan dir sync.
Karena opsi -u, --update dari
cp
Jadi, Anda dapat menambahkan cronjob seperti
cp -auv SOURCEDIR/* DESTDIR
yang akan menyalin file-file yang waktu modifikasinya telah berubah. Itu berartiDESTDIR
pada akhirnya akan mendapatkan salinan lengkap saat pengunggahan selesai.rsync
dapat melakukan pekerjaan yang sama. misalnya,rsync -av SOURCEDIR/ DESTDIR
,.Meskipun opsi -a diterapkan, beberapa atribut tertentu (misalnya, kepemilikan) hanya dapat dipertahankan oleh pengguna-super.
Lihat
man cp
,man rsync
untuk detailnya.sumber