/ tmp รับประกันว่ามีอยู่หรือไม่


42

ฉันจำเป็นต้องตรวจสอบและสร้าง/tmpก่อนที่จะเขียนลงในไฟล์ข้างในหรือไม่? สมมติว่าไม่มีใครทำงานsudo rm -rf /tmpเพราะเป็นกรณีที่หายากมาก


16
"รับประกัน" หมายความว่าอะไร? FHS ต้องการมันดังนั้น distro ที่เป็นไปตาม FHS ก็จะมี อย่างไรก็ตามมี distros วัตถุประสงค์พิเศษมากมายที่ไม่สอดคล้องกับ FHS แน่นอนว่าเป็นไปได้ที่จะสร้าง Unix / Linux distro โดยไม่ใช้ / tmp แต่ไม่ว่าคุณจะต้องสนใจเรื่องนั้นหรือไม่นั้นขึ้นอยู่กับว่าคุณสนใจที่จะสนับสนุนระบบเหล่านั้นหรือไม่
Lie Ryan

1
ทำไมไม่สร้าง dir ชั่วคราวของคุณเองและลบทิ้งเมื่อเสร็จแล้วแทนที่จะพึ่งรีบูตครั้งถัดไปเพื่อล้างข้อมูล
WGroleau

4
@WGroleau ฉันไม่รู้เกี่ยวกับ OP แต่ในสคริปต์ที่ฉันเขียนสำหรับระบบของฉันเองฉันมักจะวางไฟล์ temp ในไดเรกทอรีย่อยของ/tmp(สร้างด้วยmktemp) จากนั้นลบไดเรกทอรีย่อยนั้นเมื่อออก ระบบของฉันส่วนใหญ่ติดตั้งแบบอ่านอย่างเดียวและนี่ทำให้ฉันไม่ต้องจำไปcdยังไดเรกทอรีที่เขียนได้
Fox

1
@WGroleau ฉันไม่ได้พึ่งรีบูตเครื่องเพื่อทำความสะอาด mktempรูปลักษณ์ที่ดีจริงๆ, I'l อาจยุติการใช้ว่า
Ayush

7
@jamesqf ใช่การรีบูตเครื่องไม่จำเป็นต้องล้าง/tmpออก อย่างไรก็ตามในทางกลับกันมันได้รับอนุญาตให้ทำเช่นนั้นและสันนิษฐานว่า WGroleau ได้คาดการณ์ไกลเกินไป My /tmpis tmpfson a RAM, ดังนั้นจะถูกล้างเมื่อปิดระบบ ถึงกระนั้นนั่นก็เป็นเพียงรายละเอียดของระบบซึ่งไม่ได้รับการรับรองโดย FHS ดังนั้นเพื่อความคิดเห็นเดิมมันเป็นความเขลาที่จะพึ่งพาการมีหรือไม่มีอะไรใน/tmpระหว่างรองเท้า
underscore_d

คำตอบ:


60

FHSเอกสารที่/tmpมีอยู่เช่นเดียวกับPOSIXเพื่อให้คุณสามารถพึ่งพาเป็นของมี (อย่างน้อยในระบบตามมาตรฐาน แต่จริงๆมันสวยมากรับประกันที่จะนำเสนอบน Unix เหมือนระบบ) แต่คุณไม่ควร: ผู้ดูแลระบบหรือผู้ใช้อาจต้องการตำแหน่งอื่นสำหรับไฟล์ชั่วคราว ดูที่การค้นหา tmp dir ที่ถูกต้องบนหลายแพลตฟอร์มสำหรับรายละเอียดเพิ่มเติม


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

@Malters มีมากกว่านั้นอีกเล็กน้อย ก่อนเนมสเปซ$TMPDIRอนุญาตให้ผู้ใช้แต่ละรายมีไดเรกทอรีชั่วคราวแยกต่างหากหรือแม้แต่ใช้ไดเรกทอรีชั่วคราวที่แตกต่างกันสำหรับโปรแกรมต่าง ๆ คนเดียว/tmpไม่ได้ให้สิ่งนั้น (อีกครั้งโดยไม่มีเนมสเปซหรืออะไรทำนองนั้น) นอกจากนี้ยังมีประวัติ (หรือมรดก) จำนวนมากเพื่อพิจารณา
Stephen Kitt

ต่อผู้ใช้เป็นจุดที่ถูกต้อง แต่นั่นคือเหตุผลที่การออกแบบที่ดีจะใช้~/tmpสำหรับสิ่งนั้น ซึ่งอาจยังคงเป็นสถานที่ตั้งทางกายภาพที่/tmpแน่นอน
MSalters

44

ในทางปฏิบัติ/tmpรับประกันได้ว่ามีอยู่จริง อย่างไรก็ตามแม้ว่าจะมีอยู่นั่นไม่ได้หมายความว่าคุณควรใส่ไฟล์ชั่วคราวไว้ที่นั่น

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

ในเชลล์สคริปต์คุณสามารถใช้"${TMPDIR:-/tmp}"เป็นตำแหน่งไฟล์ชั่วคราว: ซึ่งจะขยายไปเป็นค่าTMPDIRถ้าตั้งค่าเป็น¹และเป็น/tmpอย่างอื่น หรือคุณสามารถตั้งค่าแบบTMPDIRมีเงื่อนไขในกรณีที่ไม่ได้ตั้งค่าด้วยคำสั่ง

: "${TMPDIR:=/tmp}"

"$TMPDIR"แล้วสร้างไฟล์ชั่วคราวภายใน

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

¹ และไม่ว่างเปล่า - ถ้าตัวแปรว่างเปล่ามันก็ไม่สามารถใช้งานได้เหมือนเดิมและโดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะจัดการกับตัวแปรที่ว่างเปล่าหรือไม่ได้ตั้งค่าในลักษณะเดียวกันถ้ามันควรจะมีชื่อไฟล์


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

นี่คือคำตอบที่คุณต้องการ ฉันเคยเห็นระบบที่ไม่มี / bin นับประสา / tmp
Joshua

1
นอกจากนี้A.10 โครงสร้างของไดเรกทอรีและอุปกรณ์ระบุว่า: ... /tmpไดเรกทอรีจะถูกเก็บไว้ใน POSIX.1-2008 เพื่อรองรับแอปพลิเคชันประวัติที่ถือว่ามีอยู่ การใช้งานได้รับการสนับสนุนเพื่อให้ชื่อไดเรกทอรีที่เหมาะสมในตัวแปรสภาพแวดล้อมTMPDIRและการใช้งานได้รับการสนับสนุนให้ใช้เนื้อหาของTMPDIRการสร้างไฟล์ชั่วคราว ...
Andrew Henle

3
เพียงแค่เศร้าที่จะพบว่าmktempไม่ได้อยู่ใน POSIX แม้ว่ามันจะมีอยู่แล้วในส่วนระบบปฏิบัติการที่นิยมเช่นGNU (Linux) , OpenBSD , FreeBSDและMacOS
แฟรงคลินยู

1
อาจจะมีมูลค่าเพิ่มว่าmktempเหมือนฟังก์ชั่นที่มีอยู่ในการเขียนสคริปต์และการเขียนโปรแกรมหลายภาษาเช่นlibc , Perlและงูหลาม
Gaurav

6

แม้ว่าจะมีโอกาสมากที่จะมีชีวิตอยู่คุณควรตรวจสอบด้วยเหตุผลอื่น: ก็ไม่ได้รับประกันว่าจะใหญ่ ในหลาย ๆ ระบบ/tmpได้รับการสนับสนุนโดย RAM มากกว่าดิสก์และมีแนวโน้มที่จะ จำกัด เพียงไม่กี่ GB (บนระบบ Fedora มันเป็นครึ่งหนึ่งของ RAM ตามค่าเริ่มต้น) ดังนั้นคุณควรตรวจสอบไม่ใช่แค่การมีอยู่จริง แต่ไม่ว่าจะมีที่ว่างสำหรับใส่อะไรก็ตามที่คุณตั้งใจจะใส่

ถ้าคุณมีบางสิ่งบางอย่างที่มีขนาดใหญ่, /var/tmp/การใช้งาน


2
ฉันไม่แน่ใจว่ามันเป็น "วิธี Unix" หรือไม่เพื่อตรวจสอบพื้นที่ว่างก่อนที่จะดำเนินการต่อโดยเฉพาะอย่างยิ่งเนื่องจากไม่ทราบว่าต้องใช้พื้นที่เท่าใด ไม่ว่าในกรณีใดคุณต้องเตรียมรับมือกับข้อผิดพลาดในการเขียนอย่างสง่างามในกรณีที่ระบบไฟล์ควรเต็ม และถ้าคุณกำลังจะทำสิ่งนั้นสิ่งที่ได้รับจากการตรวจสอบล่วงหน้าที่มีแนวโน้มที่จะเกิดผลเสียและผลบวกปลอม
Nate Eldredge

2
ขึ้นอยู่กับว่าคุณสามารถจัดการกับกรณีความล้มเหลวได้อย่างสง่างามฉันว่า จุดหลักคือการไม่คิดว่า/tmpสามารถจัดการไฟล์ขนาดใหญ่ได้ สมมติว่ามันเป็นการดาวน์โหลด 10GB ผ่านลิงก์ความเร็วปานกลาง "วิธี Unix" หรือไม่มันค่อนข้างน่าสมเพชที่จะค้นหาหลายชั่วโมงว่ามันจะไม่ทำงาน
mattdm

1
@mattdm การตรวจสอบ แต่เนิ่นๆนั้นดี แต่ต้องจัดการกับความล้มเหลว อาจ / tmp มีขนาด 10 GB เมื่อการดาวน์โหลดเริ่มต้นขึ้น แต่มีผู้ใช้อีกคนคัดลอก 5 GB ลงไปในขณะที่คุณกำลังดาวน์โหลด ตอนนี้คืออะไร หึ
Zan Lynx

อย่างแน่นอน! ฉันไม่ได้หมายความว่านี่เป็นข้อแก้ตัวที่จะไม่จัดการกับความล้มเหลว
mattdm

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