Di folder mana saya harus menulis untuk file perantara saya, sebagai dev?


17

Saya mulai menulis beberapa skrip bash untuk proyek saya dan mereka memerlukan beberapa file perantara atau variabel untuk ditulis.

Saya ingin tahu folder mana yang dapat saya yakin memiliki akses ketika seseorang menjalankan skrip saya? Apakah ini praktik yang biasa digunakan /tmp/? Atau haruskah saya menggunakan sesuatu yang lain?

Jawaban:


21

Saya menemukan dokumen Filesystem Hierarchy Standard sangat berharga ketika mencari hal ini.

Ada beberapa opsi,

Ini benar-benar tergantung pada jenis data yang Anda simpan.


lebih baik gunakan apa yang diberikan pengguna / lingkungan dan hanya gunakan / tmp dll sebagai cadangan. (apa dikatakan unix.stackexchange.com/a/79776/7784 )
Oluf Lorenzen

15

Jika Anda perlu menulis beberapa file sementara yang hanya berlangsung selama skrip atau aplikasi Anda berjalan, gunakan direktori yang ditunjukkan oleh TMPDIRvariabel lingkungan, atau jika variabel itu tidak didefinisikan /tmp,.

/tmpdihapus saat boot pada beberapa sistem (kadang-kadang bahkan dalam RAM, misalnya secara default pada Solaris, dan pada beberapa instalasi Linux), sehingga tidak dapat digunakan untuk file yang harus selamat dari kegagalan daya atau reboot. /var/tmpdapat digunakan untuk file yang harus selamat dari reboot, tetapi itu dapat dibersihkan oleh administrator sistem dari waktu ke waktu. Jika aplikasi Anda perlu menyimpan file secara permanen, tulis di suatu tempat di direktori home pengguna (di ~/.programmingnoobsappatau ~/.cache/programmingnoobsapp) atau di bawah /var/lib/programmingnoobsappatau /var/cache/programmingnoobsapp.

Catatan yang /tmpdibagikan di antara semua pengguna, jadi Anda harus berhati-hati saat membuat file di sana. Anda perlu memilih nama file yang belum ada, dan Anda harus berhati-hati untuk tidak mengizinkan kondisi balapan di mana proses lain membuat file di depan Anda dengan izin yang berbeda, yang bisa menjadi lubang keamanan (jika proses lain berjalan sebagai pengguna yang berbeda, kemudian dapat mengakses dan memodifikasi data proses Anda). Gunakan mktempperintah untuk membuat file di /tmpatau /var/tmp. Secara default, mktempmembuat file di $TMPDIR, atau /tmpjika TMPDIRtidak disetel, yang biasanya merupakan tempat yang tepat. Jika Anda perlu menggunakan beberapa file sementara, atau bahkan jika Anda memerlukan satu file saja, saya sarankan membuat direktori untuk semua file sementara Anda denganmktemp -d dan menghapusnya di akhir skrip Anda.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt to mktemp, saya tidak menghapus file sementara di akhir skrip saya. Saya memiliki pekerjaan cron tmpwatch yang secara otomatis menghapus file lama. Dalam sebagian besar kasus, saya tidak membaca file perantara dan sistem akan menghapus file dengan sendirinya. Namun, jika ada yang salah dengan skrip, saya memiliki semua file perantara saya untuk memudahkan debugging.
emory

1
+1 untuk mktemp. Bagi saya ini adalah jawaban yang benar: mendelegasikan tugas membuat file sementara dengan aman mktemp(lihat artikel ini ). Meskipun satu jawaban mengutip FHSmemiliki nilai yang besar juga.
Carlos Campderrós

Mengapa Anda menginisialisasi tmp_rootsebelum menetapkannya? Bukankah itu lebih alami unset?
l0b0

@ l0b0 Baik akan bekerja (kecuali di bawah set -u, tapi itu tidak biasa). Itu harus (tidak) diatur ke nilai yang aman sebelum mengatur jebakan, jika skrip terbunuh tepat setelah mengatur jebakan.
Gilles 'SO- stop being evil'

Saya akan menambahkan set -o errexitsehingga jika tmp_rootsudah diatur read-only di lingkungan itu tidak akan menghancurkan direktori yang salah ...
l0b0

2

Hanya untuk melengkapi jawaban yang sudah diposting sejauh ini.

Ada juga /dev/shmpada beberapa distribusi Linux yang dapat digunakan untuk penyimpanan sementara. Penyimpanan ini hanya boleh digunakan ketika kinerja file I / O adalah faktor penting yang diberikan/dev/shm memanfaatkan tmpfssistem file. Juga harus digunakan untuk file & data berukuran cukup. The tmpfsmerek filesystem menggunakan sistem RAM sebagai penyimpanan sehingga tidak terus-menerus dari boot untuk booting.

Ada tinjauan umum yang baik dari semua pilihan yang disebutkan di sini di StackOverflow juga dalam T&J ini berjudul: / tmp vs. / dev / shm untuk penyimpanan file temp di Linux? . Ini tercakup dengan baik dalam Tanya Jawab Pengguna Super ini berjudul: Kapan saya harus menggunakan / dev / shm / dan kapan saya harus menggunakan / tmp? .

Referensi


0

Ya, /tmpsebagian besar untuk file yang diperlukan sementara. / Tmp memiliki sedikit lengket yang berarti hanya pemilik item, pemilik direktori, atau superuser yang dapat mengganti nama atau menghapus file. banyak program menggunakan ini untuk membuat file kunci dan untuk penyimpanan data sementara. Pada beberapa distribusi direktori ini dihapus pada saat bootup atau shutdown.


1
Tidak semua / direktori tmp dihapus saat boot. Misalnya, instalasi AIX default tidak (dan ini adalah UNIX & Linux, bukan hanya Linux).
EightBitTony

Namun, jika itu adalah "memori" penduduk, yang tampaknya menjadi default dalam banyak kasus, itu hilang ketika sistem berhenti karena alasan apa pun.
mdpc
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.