ฉันควรเขียนโฟลเดอร์ใดให้กับไฟล์ระดับกลางของฉันในฐานะนักพัฒนา


17

ฉันเริ่มเขียนสคริปต์ทุบตีบางอย่างสำหรับโครงการของฉันและพวกเขาต้องการไฟล์กลางหรือตัวแปรที่จะเขียน

ฉันต้องการทราบว่าโฟลเดอร์ใดที่ฉันสามารถมั่นใจได้ว่ามีสิทธิ์เข้าถึงเมื่อมีคนรันสคริปต์ของฉัน เป็นการใช้งานทั่วไป/tmp/หรือไม่? หรือฉันควรใช้อย่างอื่น?

คำตอบ:


21

ฉันค้นหาเอกสารFilesystem Hierarchy Standard ที่มีค่าเมื่อค้นหาสิ่งนี้

มีตัวเลือกน้อย

  • / tmp - ไฟล์ชั่วคราว 'ไม่ถาวร'
  • / var / tmp - ไฟล์ชั่วคราว 'ถาวร'
  • / var / cache - ไฟล์ข้อมูลชั่วคราว 'แอปพลิเคชัน'

ขึ้นอยู่กับประเภทของข้อมูลที่คุณจัดเก็บ


ควรใช้สิ่งที่ผู้ใช้ / สภาพแวดล้อมให้คุณและใช้ / tmp เท่านั้นเป็นต้นเป็นทางเลือก (สิ่งที่unix.stackexchange.com/a/79776/7784พูด)
Oluf Lorenzen

15

หากคุณต้องการที่จะเขียนไฟล์ชั่วคราวบางส่วนเท่านั้นที่ผ่านมาเป็นเวลานานเป็นสคริปต์หรือโปรแกรมของคุณทำงานใช้ไดเรกทอรีที่ระบุโดยตัวแปรสภาพแวดล้อมหรือถ้าตัวแปรที่ไม่ได้ถูกกำหนดTMPDIR/tmp

/tmpถูกล้างเมื่อเวลาบูตในบางระบบ (บางครั้งก็เป็นแม้กระทั่งใน RAM เช่นโดยค่าเริ่มต้นใน Solaris และในการติดตั้ง Linux บางตัว) ดังนั้นจึงไม่สามารถใช้ไฟล์ที่ต้องรอดจากไฟดับหรือการรีบูต /var/tmpสามารถใช้สำหรับไฟล์ที่ต้องรอดจากการรีบูต แต่อาจได้รับการทำความสะอาดโดยผู้ดูแลระบบเป็นครั้งคราว หากความต้องการใช้ของคุณเพื่อบันทึกไฟล์บนพื้นฐานถาวรเขียนพวกเขาอยู่ที่ไหนสักแห่งในไดเรกทอรีบ้านของผู้ใช้ (ใน~/.programmingnoobsappหรือ~/.cache/programmingnoobsapp) หรือใต้หรือ/var/lib/programmingnoobsapp/var/cache/programmingnoobsapp

โปรดทราบว่า/tmpมีการแชร์ระหว่างผู้ใช้ทั้งหมดดังนั้นคุณต้องใช้ความระมัดระวังเมื่อสร้างไฟล์ที่นั่น คุณต้องเลือกชื่อไฟล์ที่ยังไม่มีอยู่และคุณต้องระวังอย่าให้สภาพการแข่งขันที่กระบวนการอื่นสร้างไฟล์ไว้ข้างหน้าคุณด้วยการอนุญาตที่แตกต่างกันซึ่งอาจเป็นช่องโหว่ความปลอดภัย (ถ้ากระบวนการอื่น กำลังทำงานในฐานะผู้ใช้อื่นจากนั้นสามารถเข้าถึงและแก้ไขข้อมูลกระบวนการของคุณได้) ใช้mktempคำสั่งในการสร้างไฟล์ในหรือ/tmp /var/tmpโดยค่าเริ่มต้นmktempสร้างไฟล์ใน$TMPDIRหรือ/tmpถ้าTMPDIRไม่ได้ตั้งค่าซึ่งมักจะเป็นสถานที่ที่เหมาะสม หากคุณต้องการใช้ไฟล์ชั่วคราวหลายไฟล์หรือแม้ว่าคุณต้องการไฟล์เดียวฉันขอแนะนำให้สร้างไดเรกทอรีสำหรับไฟล์ชั่วคราวทั้งหมดของคุณด้วยmktemp -d และลบออกเมื่อสิ้นสุดสคริปต์ของคุณ

#!/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 ฉันจะไม่ลบไฟล์ชั่วคราวที่ท้ายสคริปต์ของฉัน ฉันมีงาน tmpwatch cron ซึ่งจะลบไฟล์เก่าโดยอัตโนมัติ ในกรณีส่วนใหญ่ฉันไม่ได้อ่านไฟล์ระดับกลางและระบบจะลบไฟล์ด้วยตัวเอง อย่างไรก็ตามหากมีบางอย่างผิดปกติกับสคริปต์ฉันมีไฟล์ระดับกลางทั้งหมดของฉันเพื่อการดีบักได้ง่าย
emory

1
+1 mktempสำหรับ สำหรับฉันนี่คือคำตอบที่ถูกต้อง: มอบหมายงานการสร้างไฟล์ชั่วคราวให้อย่างปลอดภัยmktemp(ดูบทความนี้ ) แม้ว่าคำตอบเดียวที่กล่าวถึงนั้นFHSมีค่ามากเช่นกัน
Carlos Campderrós

ทำไมคุณต้องเริ่มต้นtmp_rootก่อนกำหนด? มันจะไม่เป็นธรรมชาติมากกว่าunsetนี้เหรอ?
l0b0

@ l0b0 อาจใช้งานได้ (ยกเว้นภายใต้set -uแต่เป็นเรื่องแปลก) จำเป็นต้องตั้งค่า (un) เป็นค่าที่ปลอดภัยก่อนที่จะตั้งค่ากับดักในกรณีที่สคริปต์ถูกฆ่าหลังจากตั้งค่ากับดัก
Gilles 'SO- หยุดความชั่วร้าย'

ฉันจะเพิ่มset -o errexitเพื่อว่าถ้าtmp_rootมีการตั้งค่าแบบอ่านอย่างเดียวแล้วในสภาพแวดล้อมมันจะไม่ทำลายไดเรกทอรีที่ผิด ...
l0b0

2

เพียงเติมเต็มคำตอบที่โพสต์ไปแล้ว

นอกจากนี้ยัง/dev/shmมีการกระจาย Linux บางอย่างซึ่งสามารถใช้สำหรับการจัดเก็บชั่วคราว ที่เก็บข้อมูลนี้ควรใช้ต่อเมื่อประสิทธิภาพของไฟล์ I / O เป็นปัจจัยสำคัญที่กำหนดให้/dev/shmใช้tmpfsระบบไฟล์ นอกจากนี้ควรใช้สำหรับไฟล์และข้อมูลที่มีขนาดพอสมควร tmpfsทำให้ระบบแฟ้มใช้ของแรมระบบการจัดเก็บจึงไม่ถาวรจากบูตบูต

มีภาพรวมที่ดีของตัวเลือกทั้งหมดที่กล่าวถึงที่นี่ใน StackOverflow และในคำถาม & คำตอบนี้: / tmp vs. / dev / shm สำหรับที่เก็บไฟล์ temp บน Linux? . ครอบคลุมอยู่ในคำถามและคำตอบของ SuperUser นี้: ฉันควรใช้ / dev / shm / เมื่อใดและควรใช้ / tmp เมื่อใด .

อ้างอิง


0

ใช่/tmpเป็นส่วนใหญ่สำหรับไฟล์ที่ต้องการชั่วคราว กระบวนการ / tmp มีบิตเหนียวซึ่งหมายถึงเฉพาะเจ้าของรายการเจ้าของไดเรกทอรีหรือ superuser สามารถเปลี่ยนชื่อหรือลบไฟล์ หลายโปรแกรมใช้สิ่งนี้เพื่อสร้างไฟล์ล็อคและสำหรับการจัดเก็บข้อมูลชั่วคราว ในการกระจายบางส่วนไดเรกทอรีนี้จะถูกล้างออกเมื่อบูตหรือปิด


1
ไม่ได้ล้างไดเร็กทอรี / tmp ทั้งหมดเมื่อบูต ตัวอย่างเช่นการติดตั้ง AIX เริ่มต้นไม่ได้ (และนี่คือ UNIX & Linux ไม่ใช่เฉพาะ Linux)
EightBitTony

อย่างไรก็ตามหากเป็น "หน่วยความจำ" ที่มีถิ่นที่อยู่ซึ่งดูเหมือนว่าจะเป็นค่าเริ่มต้นในหลายกรณีมันจะหายไปเมื่อระบบหยุดด้วยเหตุผลใดก็ตาม
mdpc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.