เราควรลบเนื้อหาของ / tmp ด้วยตนเองหรือไม่


26

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

คำถามของฉันคือถูก/tmpออกแบบมาเพื่อไม่ดูแลตัวเองจริง ๆ หรือ อะไรคือการปฏิบัติที่ดีที่สุด?


1
ปกติจะ/tmpได้รับการทำความสะอาดหลังจากรีบูตเครื่อง แต่สิ่งนี้ขึ้นอยู่กับระบบไฟล์ที่ติดตั้งที่นั่น สิ่งที่ไม่df -hพูด?
etagenklo

คำตอบ:


27

ในการตอบคำถาม:

  • คือ/tmpควรจะได้รับการยอบโดยอัตโนมัติ: ใช่
  • เราควรจะลบไฟล์ใน/tmpอย่างสม่ำเสมอและด้วยตนเอง: ไม่มี , ระบบของคุณจะดูแลของพวกเขา

หากคุณอาจถามตัวเอง:

  • ฉันสามารถลบไฟล์จาก/tmpเหตุผลใด (พื้นที่จำเป็นต้องการที่จะลบร่องรอยอื่น ๆ ): มันขึ้นอยู่ , อ่านต่อ

ระบบแฟ้มลำดับชั้นมาตรฐาน (FHS) กล่าว :

ไดเร็กทอรี / tmp ต้องพร้อมใช้งานสำหรับโปรแกรมที่ต้องการไฟล์ชั่วคราว

โปรแกรมต้องไม่ถือว่าไฟล์หรือไดเรกทอรีใด ๆ ใน / tmp ถูกสงวนไว้ระหว่างการเรียกใช้ของโปรแกรม

/var/tmp/มีวัตถุประสงค์ที่คล้ายกันแต่ต้องไม่ถูกลบในระหว่างการรีบูต

มันเป็นเรื่องที่ไม่สามารถรับประกันได้ว่า/tmp/หรือ/var/tmp/มีการทำความสะอาดเป็นประจำ สิ่งนี้อาจขึ้นอยู่กับการกระจายและการตั้งค่าของคุณแม้ว่าระบบส่วนใหญ่จะทำการล้างข้อมูลเป็นครั้งคราว ดูความคิดเห็นmikeโดย

หากคุณต้องการลบไฟล์ใน/ tmp ให้ดูก่อนว่าไฟล์นั้นถูกใช้งานอยู่หรือไม่ คุณสามารถทำได้อย่างง่ายดายด้วย:

lsof /tmp/file_to_delete

หากคุณมีสิทธิ์ในการทำเช่นนี้จะแสดงกระบวนการถือหมายเลขอ้างอิงไปยังไฟล์นั้นเช่นชื่อกระบวนการ PID และประเภทของไฟล์ หากต้องการแสดงกระบวนการทั้งหมดจริงๆให้เติมsudoหรือเรียกใช้ในฐานะผู้ใช้รู

lsof +D /tmp

จะแสดงไฟล์ทั้งหมดใน/tmpและไดเรกทอรีด้านล่าง ( +D) ที่เปิดอยู่ แน่นอนคุณไม่ควรลบไฟล์เหล่านี้

ในความเป็นจริงเมื่อคุณลบไฟล์ที่ยังคงเปิดอยู่ - หากคุณมีสิทธิ์ในการทำเช่นนั้น - จะไม่สามารถเข้าถึงได้จาก namespace ของระบบไฟล์ แต่ยังคงมีอยู่สำหรับกระบวนการที่มีการจัดการไฟล์เปิดอยู่ หลังจากปิดหมายเลขอ้างอิงนั้นแล้วไฟล์จะไม่สามารถเข้าถึงได้สำหรับกระบวนการนั้นอีกต่อไปและหากไม่มีกระบวนการใดที่ไฟล์นั้นเปิดขึ้นอีกจะถูกลบออกไปในที่สุด กระบวนการไม่ควรสมมติว่าไฟล์ยังมีชีวิตอยู่ระหว่างการopenเรียกใช้ครั้งต่อไปแต่โปรแกรมเมอร์ไม่เป็นระเบียบและคุณไม่มีทางรู้ได้ ด้วยเหตุนี้จึงไม่ฉลาดนักที่จะลบไฟล์ที่ยังคงใช้งานอยู่ในบางโปรแกรม


โดยทั่วไปนี่คือคำแนะนำที่ดีเยี่ยมโดยเฉพาะให้ย่อหน้าสุดท้าย แต่ในความเป็นจริงแล้วระบบจะล้างข้อมูล / tmp หรือไม่นั้นขึ้นอยู่กับระบบนั้น ตัวอย่างเช่นใน openSUSE มันไม่ได้ยกเว้นว่าคุณจะตั้งค่าเป็น (จาก / etc / sysconfig หรือผ่าน YaST) นอกจากนี้ส่วนบุคคลของผู้ใช้ ~ / tmp (หากมี) จะไม่ถูกล้างโดยอัตโนมัติ
ไมค์

ดังนั้นจึงเป็นไปได้ที่จะลบไฟล์ที่กระบวนการเปิดอยู่? และนี่ไม่ได้ผิดพลาดโปรแกรมหรือไม่ ไฟล์อยู่ที่ไหนแล้ว? โปรแกรมยังสามารถโต้ตอบกับไฟล์ "เปิด แต่ถูกลบพร้อมกันนี้" ได้หรือไม่? มีวิธีทำให้ยากหรือเป็นไปไม่ได้ที่ rm จะลบไฟล์หรือไม่? มีบางอย่างที่เหมือนกับล็อกไฟล์ใช่ไหม
CMCDragonkai

ไฟล์เป็นชุดข้อมูลในระบบไฟล์ที่ทำให้สามารถเข้าถึงได้ในเนมสเปซแบบลำดับขั้นผ่านเส้นทางและชื่อไฟล์ ไฟล์สามารถมีหลายชื่อ (ฮาร์ดลิงก์) และกระบวนการสามารถมีจุดจับเปิดสำหรับไฟล์ หากไม่สามารถเข้าถึงไฟล์นั่นคือเมื่อไม่มีชื่อและไม่มีจุดจับเปิดไฟล์นั้นจะถูกลบ การป้องกันการลบนั้นเกินความเชี่ยวชาญและ IMO ของฉันเกินกว่าขอบเขตของคำถามนี้ ลองค้นหา "การล็อกแมนดารี"
trapicki

[เป็นคำตอบที่ซ้ำกัน]
trapicki

4

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

หากคุณกล้าคุณอาจต้องการที่จะโยนคำสั่งลงใน crontab ซึ่งจะลบไฟล์ที่เก่ากว่าอายุที่แน่นอน แต่นี่อาจทำให้เกิดปัญหาบางอย่างหากมันยังคงลบไฟล์ที่ใช้อยู่ คุณอาจลองคำสั่ง (ฉันไม่ได้ลอง) เหมือน

find / tmp -type f -ctime +10 -exec rm {} +

ซึ่งในทางทฤษฎีจะลบไฟล์ทั้งหมดภายใต้ / tmp ที่เก่ากว่า 10 วัน


น่าจะเพิ่ม-rเข้าไปในนั้น
Steven Penny

1
อย่าเพิ่ม -r ลงไปอย่างแน่นอน - ซึ่งจะมีผลหรือลบไฟล์น้อยกว่า 10 วันซึ่งมีอยู่ในไดเรกทอรีที่สร้างขึ้นมากกว่า 10 วันที่ผ่านมา ในความเป็นจริงคำสั่งน่าจะค้นหา / tmp -type f -ctime +10 -exec rm {} + เพื่อ จำกัด การค้นหาไฟล์ (การใช้คำสั่ง find จะทำการ
ย่อ

1

ไดเร็กทอรี / tmp และ / var / tmp จะถูกล้างตามกำหนดเวลาปกติ สิ่งนี้อาจขึ้นอยู่กับ distro ของคุณ ในระบบ CentOS ของฉัน (โคลนของ RedHat) มีงาน cron กำหนดให้ทำงานtmpwatchเป็น tmp dir ทำความสะอาดบนตารางเวลาประจำวัน ไฟล์ใน / var / tmp ได้รับอนุญาตให้ติดได้นานกว่าไฟล์ใน / tmp / เล็กน้อย ฉันเคยเห็นสคริปต์ที่ตัด / tmp (แต่ไม่ชัดเจน / var / tmp) ในการรีบูตโดยรู้ว่าไม่มีสิ่งใดที่เก็บไฟล์นั้นไว้เปิดเนื่องจากกระบวนการทั้งหมดเป็นของใหม่

ดังนั้นใช่ / tmp มีการบำรุงรักษาจากสคริปต์พื้นฐาน มันยังสามารถเติมได้นอกเวลาการบำรุงรักษาเหล่านั้น หากคุณเลือกที่จะทำความสะอาดสิ่งต่าง ๆ ด้วยตนเองการดูแลระบบที่ดีที่สุดคือต้องระวัง Sysadmin ตำนานพูดถึง symlink ใน / tmp ชี้ไปที่ไฟล์ระบบที่จำเป็นที่ถูกลบเมื่อ n00b sysadmins วิ่งfindสคริปต์ง่าย


2
บน Centos 7 และระบบ Redhat เหมือนรุ่น 7+ อื่น ๆ ที่มี systemd การล้างข้อมูลจะถูกกำหนดค่าใน /usr/lib/tmpfiles.d/tmp.conf สิ่งนี้ถูกเรียกใช้โดยเป้าหมาย systemd-tmpfiles-clean.service ของ systemd
ผู้ใช้ shonky linux

1

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

นี่คือ/etc/cron.daily/tmpwatchสคริปต์

#! bin / sh /
ธง = -umc
/ usr / sbin / tmpwatch "$ flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *' 10d / tmp
/ usr / sbin / tmpwatch "$ flag" 30d / var / tmp
สำหรับ d ใน / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; ทำ
    ถ้า [-d "$ d"]; แล้วก็
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    Fi
เสร็จแล้ว

/tmp เนื้อหาไดเรกทอรีจะถูกลบเมื่อระบบรีบู๊ตเนื่องจากกระบวนการทำงานอาจมีการเข้าถึงไฟล์จากไดเรกทอรีนั้น


0

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


0

FHSกำหนด/tmpไดเรกทอรีเป็น "ไฟล์ชั่วคราว (เห็น var / tmp /) มักจะไม่เก็บรักษาไว้ระหว่างระบบการเรียบ" และ/var/tmpเป็น "ไฟล์ชั่วคราวเพื่อที่จะรักษาระหว่างการเริ่มต้นใหม่"

ทุกวันนี้/tmpการมีระบบไฟล์ RAM (tmpfs) เป็นค่าเริ่มต้น (แม้ว่าจะเป็นตัวเลือก) ในการแจกแจง GNU / Linux จำนวนมาก/tmpนั้นไม่ใช่แบบถาวร

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


โปรแกรมจำนวนมากสามารถทำงานได้ดีขึ้นมากในการล้างไฟล์/tmpเมื่อทำเสร็จหรือเมื่อออกจากโปรแกรม แต่ยังคงมีปัญหาของไฟล์ที่เหลือ/tmpหลังจากการหยุดทำงานผิดปกติ (ผิดพลาด) ของโปรแกรม
Kevin Fegan

0

หากคุณใช้ Debian (หรืออนุพันธ์เช่น Ubuntu) คุณควรดูไฟล์/ etc / default / rcS ของคุณ และปรับTMPTIMEตัวแปรสภาพแวดล้อม ตามคำนิยามสิ่งที่อยู่ใน / tmp ไม่มีอะไรให้ทำที่นี่ในการรีบูตครั้งต่อไป

ฉันแนะนำ

  • ใช้TMPTIMEตัวแปรบนเซิร์ฟเวอร์
  • mount / tmp เป็น tmpfs (เป็น ram) บนเดสก์ท็อป (เพื่อความเร็วที่มากกว่า)

0

แน่นอนว่าดิสทริบิวชั่นต่างกัน แต่ฉันคาดหวังว่าไฟล์ชั่วคราวจะได้รับการจัดการโดยอัตโนมัติโดยระบบที่ล้าสมัย พวกเขาต้องการใช้งาน cron หรือบริการ systemd-tmpfiles-clean หากคุณกังวลเกี่ยวกับพื้นที่ดิสก์นี่เป็นคำสั่งที่มีประโยชน์ในการดูว่าแต่ละโฟลเดอร์รูทนั้นมีพื้นที่ว่างเท่าใด:

du -hs /* | sort -h

หากต้องการดูว่าระบบของคุณใช้บริการ systemd เพื่อจัดการไฟล์ชั่วคราวหรือไม่คุณสามารถลอง:

systemctl status systemd-tmpfiles-clean

ที่ด้านล่างคุณจะเห็นสิ่งต่อไปนี้ซึ่งจะแจ้งให้คุณทราบเมื่อบริการถูกเรียกใช้ครั้งสุดท้าย:

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

โปรดทราบว่าบริการนี้จะออกทันทีที่เสร็จสิ้นการล้างข้อมูล บริการจับเวลามีหน้าที่ในการเรียกมันเป็นประจำ คุณสามารถตรวจสอบกับ:

systemctl status systemd-tmpfiles-clean.timer

และคุณควรคาดหวังสิ่งต่อไปนี้:

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

หากคุณดูอีกครั้งที่บริการจริงที่รับผิดชอบในการล้างไฟล์คุณจะเห็นว่ามันทำงานทั้งหมด:

/usr/bin/systemd-tmpfiles --clean

ดังนั้นคุณสามารถเรียกใช้คำสั่งนั้นโดยตรงหรือทำอย่างถูกต้องเพียงแค่:

systemctl start systemd-tmpfiles-clean

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

ที่เดียวที่จะมองหาการจัดการไฟล์ชั่วคราวทั่วไป/usr/lib/tmpfiles.d/tmp.confซึ่งอาจมีบรรทัดที่เกี่ยวข้องดังต่อไปนี้:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

คุณสามารถเปลี่ยนสิ่งเหล่านี้ให้สั้นลงได้หากระบบของคุณมีที่ว่างเหลืออยู่ตัวอย่างเช่นเป็น:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

เพื่อให้แน่ใจว่าคุณกำลังทำอะไรอยู่man tmpfiles.dให้อ่านคู่มือ อีกครั้งฉันได้พบวิธีการนำเสนอที่นี่เพื่อให้มีความเกี่ยวข้องกับ CentOS (RedHat based) และระบบ Ubuntu แต่ฉันไม่ทราบมากเกี่ยวกับการแจกแจงอื่น ๆ

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