Saya memiliki program yang perlu membuat file sementara. Ini ditulis untuk mesin cluster.
Jika saya menyimpan file-file itu ke direktori sementara seluruh sistem (misalnya:) /tmp
, beberapa pengguna mengeluh program gagal karena mereka tidak memiliki akses yang tepat ke / tmp. Tetapi jika saya menyimpan file-file itu ke direktori kerja, para pengguna itu juga mengeluh mereka tidak ingin melihat file-file misterius itu.
Yang mana yang merupakan praktik yang lebih baik? Haruskah saya bersikeras bahwa menabung /tmp
adalah pendekatan yang tepat dan membela setiap kegagalan sebagai "berfungsi sebagaimana dimaksud" (mis. Minta admin Anda untuk izin / akses yang tepat)?
data
file-handling
Catur kecil
sumber
sumber
/tmp
sistem seperti Unix, itu salah konfigurasi. Superuser harus melakukan sesuatu sepertichmod 1777 /tmp
./tmp/
yang seharusnya Anda gunakan. Lihat beberapa jawaban;)Jawaban:
File sementara harus disimpan ke direktori sementara sistem operasi karena beberapa alasan:
Sistem operasi membuatnya sangat mudah untuk membuat file-file itu sambil memastikan bahwa nama mereka akan unik .
Sebagian besar perangkat lunak cadangan tahu apa saja direktori yang berisi file sementara, dan melewatkannya. Jika Anda menggunakan direktori saat ini, ini bisa memiliki efek penting pada ukuran cadangan tambahan jika cadangan sering dilakukan.
Direktori sementara mungkin pada disk yang berbeda, atau dalam RAM, membuat akses baca-tulis jauh lebih cepat .
File sementara sering dihapus selama reboot (jika mereka berada di ramdisk, mereka hilang begitu saja). Ini mengurangi risiko pertumbuhan tanpa batas jika aplikasi Anda tidak selalu menghapus file temp dengan benar (misalnya setelah crash).
Membersihkan file temp dari direktori kerja dapat dengan mudah menjadi berantakan jika file disimpan bersama dengan file aplikasi dan pengguna. Anda dapat mengurangi masalah ini dengan membuat direktori terpisah di dalam direktori saat ini, tetapi ini dapat menyebabkan masalah lain:
The Panjang jalan bisa terlalu lama pada beberapa platform. Misalnya, di Windows, batas jalur untuk beberapa API, kerangka kerja dan aplikasi mengerikan , yang berarti bahwa Anda dapat dengan mudah mencapai batas tersebut jika direktori saat ini sudah jauh di hierarki hierarki dan nama file sementara Anda terlalu panjang.
Di server, memantau pertumbuhan direktori sementara sering dilakukan dengan segera. Jika Anda menggunakan direktori yang berbeda, itu mungkin tidak dipantau, dan memantau seluruh disk tidak akan membantu untuk dengan mudah mengetahui bahwa itu adalah file temp yang mengambil semakin banyak tempat.
Adapun kesalahan akses ditolak, pastikan Anda membiarkan sistem operasi membuat file sementara untuk Anda. Sistem operasi dapat, misalnya, mengetahui bahwa untuk pengguna tertentu, direktori selain
/tmp
atauC:\Windows\temp
harus digunakan; dengan demikian, dengan mengakses direktori tersebut secara langsung, Anda mungkin memang menemukan kesalahan akses ditolak.Jika Anda mendapatkan akses ditolak bahkan ketika menggunakan panggilan sistem operasi, yah, itu berarti bahwa mesin itu dikonfigurasi dengan buruk; ini sudah dijelaskan oleh Blrfl . Terserah administrator sistem untuk mengkonfigurasi mesin; Anda tidak perlu mengubah aplikasi Anda.
Membuat file sementara sangat mudah dalam banyak bahasa. Beberapa contoh:
Pesta:
Python:
C #:
PHP:
Rubi:
Perhatikan bahwa dalam beberapa kasus, seperti dalam PHP dan Ruby, file dihapus ketika pegangan ditutup. Itu manfaat tambahan menggunakan perpustakaan yang dibundel dengan bahasa / kerangka kerja.
sumber
fopen("/tmp/mytmpfile", "w");
saya harus membuat panggilan sistem untuk menangani file sementara?tmpfile(3)
untuk membuat file sementara, atau setidaknya meneleponmktemp(3)
untuk membuat nama file.Ada standar untuk ini, dan hal terbaik yang dapat Anda lakukan adalah menyesuaikannya.
POSIX, yang diikuti oleh hampir semua OS non-mainframe dengan signifikansi apa pun yang kemungkinan besar akan Anda hadapi, memiliki ketentuan untuk membuat file sementara yang dinamai unik dalam direktori menggunakan nilai default yang dapat dikonfigurasi ulang oleh lingkungan:
stdio.h
Header C secara opsional dapat menyertakanP_tmpdir
makro yang menamai direktori sementara sistem.TMPDIR
adalah variabel lingkungan kanonik untuk mengubah lokasi file sementara. Sebelum POSIX, ada variabel lain yang digunakan, jadi saya cenderung pergi dengan yang pertama atauTMP
,TEMPDIR
danTEMP
yang memiliki nilai, punting dan menggunakan sistem default jika tidak ada yang ada.mkstemp()
dantempfile()
akan menghasilkan file sementara yang unik.Jika pengguna Anda ditolak kemampuan untuk membuat file sementara, sistem salah konfigurasi atau administrator tidak menjelaskan apa kebijakan mereka tentang hal-hal seperti itu. Dalam kasus tersebut, Anda akan sangat kuat dalam mengatakan bahwa program Anda sesuai dengan standar portabilitas yang sudah mapan dan bahwa perilakunya dapat diubah menggunakan variabel lingkungan yang ditentukan oleh standar.
sumber
P_tmpdir
bukan bagian dari yangstdio.h
didefinisikan oleh spesifikasi bahasa C. Mungkin didefinisikan oleh POSIX atau SVID.pam_tmpdir
- set iniTMPDIR
danTMP
menjadi berbeda untuk setiap pengguna, untuk ketahanan dan privasi. Ini juga berguna untuk dapat mengaturTMPDIR
untuk satu perintah - jika Anda memiliki direktori sementara yang biasa dalam sistem file RAM untuk kecepatan, Anda mungkin perlu melakukan ini untuk perintah yang menghasilkan file sementara besar (seperti raksasasort
, misalnya). Jangan abaikan standar / konvensi yang diharapkan pengguna Anda!Direktori temp-file-sangat bergantung pada sistem / lingkungan. Misalnya dir web-server-temp terpisah dari os-temp-dir untuk alasan keamanan.
Di bawah ms-windows setiap pengguna memiliki temp-dir sendiri.
Anda harus menggunakan createTempFile () untuk ini jika fungsi seperti itu tersedia.
sumber
Jawaban sebelumnya, meskipun benar, tidak valid untuk sebagian besar cluster komputer skala besar.
Cluster komputer tidak selalu mengikuti konvensi standar untuk mesin, biasanya untuk alasan yang baik, dan tidak ada gunanya membahasnya dengan sysadmin.
Direktori Anda saat ini merujuk ke sistem file pusat, yang diakses melalui jaringan. Ini tidak hanya lambat, tetapi juga menempatkan banyak pada sistem untuk pengguna lainnya, jadi Anda tidak boleh menggunakannya kecuali Anda tidak banyak menulis dan Anda dapat memulihkannya jika pekerjaan macet.
Node komputasi memiliki hard drive sendiri, yaitu sistem file tercepat yang tersedia, dan apa yang seharusnya Anda gunakan. Dokumentasi klaster harus memberitahu Anda apa itu, biasanya
/scratch
,/tmp/[jobid]
atau beberapa variabel lingkungan standar non ($SNIC_TMP
di salah satu yang saya gunakan).Jadi, apa yang saya rekomendasikan adalah membuatnya dapat dikonfigurasi pengguna. Default dapat menjadi yang pertama Anda memiliki akses tulis ke:
$TMPDIR
tmpfile
/tmp
.
Tetapi mengharapkan tingkat keberhasilan yang rendah dengan pendekatan ini, dan pastikan untuk mengeluarkan peringatan besar.
Sunting: Saya akan menambahkan alasan lain untuk memaksanya diatur oleh pengguna. Salah satu kluster saya telah
$TMPDIR
ditetapkan/scratch
, yaitu dapat ditulis oleh pengguna dan pada hard drive lokal. Tetapi, dokumentasi mengatakan bahwa apa pun yang Anda tulis di luar/scratch/[jobid]
dapat dihapus pada titik mana pun, bahkan di tengah jalan. Jadi, jika Anda mengikuti standar, dan kepercayaan$TMPDIR
, Anda akan menemukan crash acak, sangat sulit untuk di-debug. Jadi, Anda mungkin menerima$TMPDIR
, tetapi tidak mempercayainya.Beberapa kluster lain memang memiliki variabel ini yang dikonfigurasi dengan benar, sehingga Anda dapat menambahkan opsi untuk mempercayai secara eksplisit
$TMPDIR
, jika tidak, berikan peringatan besar dan gemuk.sumber
Untuk banyak aplikasi, Anda harus mempertimbangkan menempatkan file-file sementara di
$XDG_RUNTIME_DIR
atau$XDG_CACHE_HOME
(dirs lainnya XDG adalah untuk file nontemporary). Untuk instruksi tentang penghitungan mereka jika mereka tidak diteruskan secara eksplisit di lingkungan, lihat spec berbasis XDG atau temukan perpustakaan yang sudah mengimplementasikan bagian itu.Namun, perlu diketahui bahwa
$XDG_RUNTIME_DIR
itu merupakan tambahan baru dan tidak ada cadangan standar untuk sistem yang lebih lama karena masalah keamanan.Jika tidak ada yang cocok, maka itu
/tmp
adalah tempat yang benar. Anda tidak boleh berasumsi direktori saat ini dapat ditulis.sumber
Ini lebih seperti alternatif, tetapi Anda dapat memutuskan tautan () file segera setelah fopen (). Itu tergantung dari pola penggunaan cource.
Membatalkan tautan file, jika dapat dilakukan, membantu untuk beberapa cara:
File harus dibuat di / tmp. Jika pengguna tidak memiliki hak untuk membuat file di sana, ini berarti sistem salah konfigurasi.
File tidak dapat dibuat di direktori home pengguna. Banyak pengguna, seperti "tidak ada", "www-data" dan banyak lainnya, tidak memiliki hak untuk menulis di direktori rumah mereka, atau mereka bahkan chroot () - red. Perhatikan bahwa bahkan di lingkungan chroot / tmp masih ada.
sumber