Apakah saya perlu memeriksa & membuat /tmpsebelum menulis ke file di dalamnya? Anggaplah tidak ada yang lari sudo rm -rf /tmpkarena itu kasus yang sangat langka
Apa yang Anda maksud dengan "dijamin"? FHS memerlukannya, sehingga distro yang memenuhi FHS akan memilikinya. Namun, ada banyak distro tujuan khusus yang tidak sesuai dengan FHS. Memang mungkin untuk membuat distro Unix / Linux tanpa / tmp, tetapi apakah Anda perlu peduli sepenuhnya tergantung pada apakah Anda peduli mendukung sistem tersebut.
Lie Ryan
1
Mengapa tidak membuat dir sementara Anda sendiri dan menghapusnya ketika Anda selesai dengan itu alih-alih mengandalkan reboot berikutnya untuk membersihkan?
WGroleau
4
@WGroleau Saya tidak tahu tentang OP, tetapi pada skrip yang saya tulis untuk sistem saya sendiri, saya biasanya meletakkan file temp di subdirektori dari /tmp(dibuat dengan mktemp) kemudian menghapus subdirektori itu saat keluar. Sebagian besar sistem saya di-mount hanya-baca dan ini membuat saya tidak harus ingat untuk cdke direktori yang dapat ditulis
Fox
1
@WGroleau saya tidak mengandalkan reboot untuk membersihkannya. yang mktempterlihat benar-benar hebat, i'l mungkin berakhir dengan menggunakan itu.
Ayush
7
@ jamesqf Ya, reboot tidak harus dihapus /tmp. Namun, sebaliknya diizinkan untuk melakukannya, dan mungkin WGroleau telah memperkirakan terlalu jauh dari itu. Saya /tmpadalah tmpfsdiadakan di RAM, sehingga tidak bisa dihapus pada shutdown. Namun, itu hanya detail dari sistem, yang tidak dijamin oleh FHS. Jadi, untuk komentar asli, itu bodoh untuk mengandalkan ada atau tidaknya apa pun di /tmpantara sepatu bot.
underscore_d
Jawaban:
60
The FHS mandat yang /tmpada, seperti halnya POSIX sehingga Anda dapat mengandalkan nya berada di sana (setidaknya pada sistem compliant, tapi benar-benar itu cukup banyak dijamin untuk hadir pada Unix-seperti sistem). Tetapi Anda tidak boleh: administrator sistem atau pengguna mungkin lebih suka lokasi lain untuk file sementara. Lihat Menemukan dir tmp yang benar di beberapa platform untuk detail lebih lanjut.
Ini tentu saja merupakan kegagalan desain. /tmpadalah sebuah nama. $TMPDIRadalah nama lain. Jika Anda tidak dapat mengandalkan /tmpnama kanan direktori sementara, mengapa Anda dapat mengandalkan $TMPDIRnama variabel lingkungan yang tepat? Mengapa saya tidak harus memeriksa $TMPDIRVARuntuk mendapatkan nama yang variabel? Satu tingkat tipuan sudah cukup, dan /tmpmemang begitu. Itu tidak mengatakan apa-apa tentang penyimpanan yang sebenarnya, itu hanya sebuah nama.
MSalters
@ Pemalas ada sedikit lebih dari itu. Sebelum ruang nama, $TMPDIRdiizinkan setiap pengguna untuk memiliki direktori sementara yang terpisah, atau bahkan menggunakan direktori sementara yang berbeda untuk program yang berbeda; satu /tmptidak menyediakan itu (sekali lagi, tanpa ruang nama atau yang serupa). Ada juga banyak sejarah (atau warisan) yang harus diperhitungkan.
Stephen Kitt
Per pengguna adalah poin yang valid, tetapi itulah sebabnya desain yang bagus akan digunakan ~/tmpuntuk itu. Yang mungkin masih lokasi fisik yang sama dengan /tmp, tentu saja.
MSalters
44
Dalam praktiknya, /tmpdijamin cukup banyak ada. Namun, meskipun ada, itu tidak berarti Anda harus meletakkan file sementara di sana.
The standar konvensi adalah dengan menggunakan TMPDIRvariabel lingkungan. Jika ada, itu menunjuk ke direktori untuk file sementara. Jika tidak ada, masukkan file sementara /tmp.
Dalam skrip shell, Anda dapat menggunakan "${TMPDIR:-/tmp}"sebagai lokasi file sementara: ini meluas ke nilai TMPDIRjika diset ¹, dan /tmpsebaliknya. Atau Anda dapat mengatur TMPDIRkondisional jika tidak disetel, dengan perintah
: "${TMPDIR:=/tmp}"
dan kemudian buat file sementara di dalamnya "$TMPDIR".
Perhatikan bahwa aplikasi apa pun dapat membuat file di bawah /tmpatau $TMPDIR. Lebih lanjut, direktori ini dapat dibagi di antara pengguna, jadi Anda harus berhati-hati tentang izin saat membuat file. Banyak sistem (Linux, * BSD) memiliki perintah mktempyang membuat file dengan aman di direktori yang benar. Ini umumnya ide yang baik untuk digunakan mktempuntuk membuat file sementara dan direktori - terutama dari skrip shell, di mana tidak mungkin untuk membuat file dengan aman di direktori bersama karena kemungkinan serangan symlink ( mkdirbaik-baik saja jika Anda menangani kesalahan dengan benar).
¹ dan non-kosong - jika variabelnya kosong maka tidak dapat digunakan sebagaimana mestinya, dan umumnya merupakan ide bagus untuk memperlakukan variabel kosong atau tidak disetel dengan cara yang sama jika mereka seharusnya berisi nama file.
Mungkin Anda bisa menyebutkan bahwa pengguna harus mengharapkan tabrakan nama file. Jadi IMO satu-satunya cara yang disarankan untuk membuat file di / tmp adalah perintah mktempdan ini juga harus menangani $ TMPDIR "secara otomatis.
rudimeier
Ini jawaban yang Anda inginkan. Saya telah melihat sistem tanpa / bin apalagi / tmp.
Joshua
1
Struktur dan Perangkat Direktori A.10 juga menyatakan: ... /tmpDirektori tersebut disimpan dalam POSIX.1-2008 untuk mengakomodasi aplikasi historis yang mengasumsikan ketersediaannya. Implementasi didorong untuk memberikan nama direktori yang sesuai dalam variabel lingkungan TMPDIRdan aplikasi didorong untuk menggunakan konten TMPDIRuntuk membuat file sementara. ...
Andrew Henle
3
Hanya sedih untuk menemukan yang mktemptidak ada dalam POSIX, meskipun sudah ada di sistem operasi paling populer seperti GNU (Linux) , OpenBSD , FreeBSD , dan macOS .
Franklin Yu
1
Mungkin patut ditambahkan bahwa mktemp-seperti fungsi tersedia dalam banyak bahasa scripting dan pemrograman, seperti libc , Perl dan Python .
Gaurav
6
Meskipun sangat mungkin ada, Anda harus memeriksa alasan lain: itu tidak dijamin besar . Pada banyak sistem, /tmpdidukung oleh RAM daripada disk, dan cenderung terbatas pada beberapa GB. (Pada sistem Fedora, secara default setengah dari RAM.) Jadi, Anda harus memeriksa tidak hanya untuk keberadaan, tetapi apakah ada ruang untuk meletakkan apa pun yang ingin Anda taruh di sana.
Jika Anda memiliki sesuatu yang besar, gunakan /var/tmp/.
Saya tidak yakin apakah itu "cara Unix" untuk memeriksa ruang yang tersedia sebelum melanjutkan, terutama karena tidak selalu diketahui persis berapa banyak ruang yang akan Anda butuhkan. Bagaimanapun, Anda harus siap untuk menangani kesalahan penulisan dengan anggun seandainya sistem file menjadi penuh; dan jika Anda akan melakukan itu, apa yang diperoleh dengan melakukan pemeriksaan di muka yang akan cenderung negatif dan positif palsu?
Nate Eldredge
2
Tergantung seberapa anggun Anda bisa menangani kasus kegagalan, saya kira. Intinya adalah jangan menganggap bahwa /tmpbisa menangani file besar. Katakanlah ini adalah unduhan 10GB melalui tautan kecepatan sedang. "Unix way" atau tidak, itu cukup menyedihkan untuk mengetahui beberapa jam bahwa itu tidak akan berhasil.
mattdm
1
@mattdm Memeriksa lebih awal itu baik tetapi kegagalan harus ditangani. Mungkin / tmp memiliki 10 GB tersedia saat unduhan dimulai tetapi Pengguna Lain menyalin 5 GB ke sana saat unduhan Anda berjalan. Sekarang apa? Heh.
Zan Lynx
Pastinya! Saya tidak bermaksud ini sebagai alasan untuk tidak menangani kegagalan.
mattdm
"Jika Anda memiliki sesuatu yang besar" - gunakan / tmp dan biarkan OS bertukar jika perlu.
/tmp
(dibuat denganmktemp
) kemudian menghapus subdirektori itu saat keluar. Sebagian besar sistem saya di-mount hanya-baca dan ini membuat saya tidak harus ingat untukcd
ke direktori yang dapat ditulismktemp
terlihat benar-benar hebat, i'l mungkin berakhir dengan menggunakan itu./tmp
. Namun, sebaliknya diizinkan untuk melakukannya, dan mungkin WGroleau telah memperkirakan terlalu jauh dari itu. Saya/tmp
adalahtmpfs
diadakan di RAM, sehingga tidak bisa dihapus pada shutdown. Namun, itu hanya detail dari sistem, yang tidak dijamin oleh FHS. Jadi, untuk komentar asli, itu bodoh untuk mengandalkan ada atau tidaknya apa pun di/tmp
antara sepatu bot.Jawaban:
The FHS mandat yang
/tmp
ada, seperti halnya POSIX sehingga Anda dapat mengandalkan nya berada di sana (setidaknya pada sistem compliant, tapi benar-benar itu cukup banyak dijamin untuk hadir pada Unix-seperti sistem). Tetapi Anda tidak boleh: administrator sistem atau pengguna mungkin lebih suka lokasi lain untuk file sementara. Lihat Menemukan dir tmp yang benar di beberapa platform untuk detail lebih lanjut.sumber
/tmp
adalah sebuah nama.$TMPDIR
adalah nama lain. Jika Anda tidak dapat mengandalkan/tmp
nama kanan direktori sementara, mengapa Anda dapat mengandalkan$TMPDIR
nama variabel lingkungan yang tepat? Mengapa saya tidak harus memeriksa$TMPDIRVAR
untuk mendapatkan nama yang variabel? Satu tingkat tipuan sudah cukup, dan/tmp
memang begitu. Itu tidak mengatakan apa-apa tentang penyimpanan yang sebenarnya, itu hanya sebuah nama.$TMPDIR
diizinkan setiap pengguna untuk memiliki direktori sementara yang terpisah, atau bahkan menggunakan direktori sementara yang berbeda untuk program yang berbeda; satu/tmp
tidak menyediakan itu (sekali lagi, tanpa ruang nama atau yang serupa). Ada juga banyak sejarah (atau warisan) yang harus diperhitungkan.~/tmp
untuk itu. Yang mungkin masih lokasi fisik yang sama dengan/tmp
, tentu saja.Dalam praktiknya,
/tmp
dijamin cukup banyak ada. Namun, meskipun ada, itu tidak berarti Anda harus meletakkan file sementara di sana.The standar konvensi adalah dengan menggunakan
TMPDIR
variabel lingkungan. Jika ada, itu menunjuk ke direktori untuk file sementara. Jika tidak ada, masukkan file sementara/tmp
.Dalam skrip shell, Anda dapat menggunakan
"${TMPDIR:-/tmp}"
sebagai lokasi file sementara: ini meluas ke nilaiTMPDIR
jika diset ¹, dan/tmp
sebaliknya. Atau Anda dapat mengaturTMPDIR
kondisional jika tidak disetel, dengan perintahdan kemudian buat file sementara di dalamnya
"$TMPDIR"
.Perhatikan bahwa aplikasi apa pun dapat membuat file di bawah
/tmp
atau$TMPDIR
. Lebih lanjut, direktori ini dapat dibagi di antara pengguna, jadi Anda harus berhati-hati tentang izin saat membuat file. Banyak sistem (Linux, * BSD) memiliki perintahmktemp
yang membuat file dengan aman di direktori yang benar. Ini umumnya ide yang baik untuk digunakanmktemp
untuk membuat file sementara dan direktori - terutama dari skrip shell, di mana tidak mungkin untuk membuat file dengan aman di direktori bersama karena kemungkinan serangan symlink (mkdir
baik-baik saja jika Anda menangani kesalahan dengan benar).¹ dan non-kosong - jika variabelnya kosong maka tidak dapat digunakan sebagaimana mestinya, dan umumnya merupakan ide bagus untuk memperlakukan variabel kosong atau tidak disetel dengan cara yang sama jika mereka seharusnya berisi nama file.
sumber
mktemp
dan ini juga harus menangani $ TMPDIR "secara otomatis./tmp
Direktori tersebut disimpan dalam POSIX.1-2008 untuk mengakomodasi aplikasi historis yang mengasumsikan ketersediaannya. Implementasi didorong untuk memberikan nama direktori yang sesuai dalam variabel lingkunganTMPDIR
dan aplikasi didorong untuk menggunakan kontenTMPDIR
untuk membuat file sementara. ...mktemp
tidak ada dalam POSIX, meskipun sudah ada di sistem operasi paling populer seperti GNU (Linux) , OpenBSD , FreeBSD , dan macOS .mktemp
-seperti fungsi tersedia dalam banyak bahasa scripting dan pemrograman, seperti libc , Perl dan Python .Meskipun sangat mungkin ada, Anda harus memeriksa alasan lain: itu tidak dijamin besar . Pada banyak sistem,
/tmp
didukung oleh RAM daripada disk, dan cenderung terbatas pada beberapa GB. (Pada sistem Fedora, secara default setengah dari RAM.) Jadi, Anda harus memeriksa tidak hanya untuk keberadaan, tetapi apakah ada ruang untuk meletakkan apa pun yang ingin Anda taruh di sana.Jika Anda memiliki sesuatu yang besar, gunakan
/var/tmp/
.sumber
/tmp
bisa menangani file besar. Katakanlah ini adalah unduhan 10GB melalui tautan kecepatan sedang. "Unix way" atau tidak, itu cukup menyedihkan untuk mengetahui beberapa jam bahwa itu tidak akan berhasil.