ไดเร็กทอรี / tmp ถูกล้างออกอย่างไร?


300

วิธีการคือ/tmpไดเรกทอรีทำความสะอาด? เป็นอัตโนมัติหรือไม่ ถ้าเป็นเช่นนั้นทำความสะอาดบ่อยแค่ไหน?


15
ไฟล์ชั่วคราวของฉันไม่เคยถูกเขียนลงดิสก์ พวกเขาเขียนไปยังดิสก์ RAM ฉันใส่tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0ใน / etc / fstab
ไม่ระบุชื่อ

คำตอบ:


192

บันทึก! คำตอบนี้ล้าสมัยตั้งแต่อย่างน้อย Ubuntu 14.04 ดูคำตอบอื่น ๆ สำหรับสถานการณ์ปัจจุบันและหากพวกเขาพิสูจน์ว่าถูกต้องแล้วก็ถอนรากถอนโคนอย่างดุเดือด แสดงความคิดเห็นด้วยดังนั้นฉันสามารถใส่ลิงค์ที่นี่เพื่อคำตอบที่ถูกต้องในปัจจุบัน

สำหรับ 14.04 ดูhttps://askubuntu.com/a/759048/1366

สำหรับ 16.10 ดูhttps://askubuntu.com/a/857154/453746


คำตอบเก่าจาก 2011:

การทำความสะอาด/tmpทำได้โดยสคริปต์/etc/init/mounted-tmp.confธรรมดา สคริปต์ถูกเรียกใช้โดยการพุ่งพรวดทุกครั้งที่/tmpถูกเมา ในทางปฏิบัติหมายความว่าทุกครั้งที่บูต

สคริปต์ทำสิ่งต่อไปนี้อย่างคร่าวๆ: หากไฟล์ใน/tmpรุ่นเก่ากว่า$TMPTIMEวันจะถูกลบทิ้ง

ค่าเริ่มต้น$TMPTIMEคือ 0 ซึ่งหมายความว่าทุกไฟล์และไดเรกทอรีในการ/tmpได้รับการลบ เป็นตัวแปรสภาพแวดล้อมที่กำหนดไว้ใน$TMPTIME/etc/default/rcS


นั่นไม่จริงสำหรับ 14.04 อีกต่อไป (สคริปต์ไม่มีอยู่อีกต่อไป)
Martin Schröder

@Martin Schröder - สคริปต์มีอยู่ในระบบของฉัน & เป็นการติดตั้งแบบสะอาดที่ 14.04 และไม่มี tmpreaper!
แลนซ์ฮอลแลนด์

ตอนนี้ฉันใช้ arch linux ฉันจึงไม่สามารถตรวจสอบได้ ขอโทษ กรุณามีคนยืนยันและแสดงความคิดเห็นหรือแก้ไขคำตอบของฉัน
lesmana

4
ใน ubuntu 16.04 tmpreaper ถูกยกเลิกเนื่องจากไม่ปลอดภัยโปรดดู: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha

1
ไม่ได้ใน Ubuntu 16.04 มันถูกแทนที่โดยกลไก systemd อ่านเอกสารนั้นและสิ่งที่คุณจะพบจริง ๆ คือคำอธิบายว่าทำไมการวิเคราะห์ความปลอดภัยที่อ้างว่ามีความไม่มั่นคงนั้นมีข้อบกพร่อง
JdeBP

141

ไดเรกทอรีจะถูกล้างโดยค่าเริ่มต้นในทุก ๆ การบู๊ตเพราะTMPTIMEเป็น 0 โดยค่าเริ่มต้น

ที่นี่คุณสามารถเปลี่ยนเวลาในไฟล์ต่อไปนี้:

/etc/default/rcS

TMPTIME บอกว่าความถี่ tmp dir จะถูกลบในไม่กี่วัน


9
การล้างทุกครั้งที่บูตไม่เหมาะสำหรับเครื่องที่ไม่รีบูตเช่นเดียวกับเซิร์ฟเวอร์ ฉันมีไฟล์มากกว่า 500,000 ไฟล์ที่มีพื้นที่ 5Gb ใน / tmp ของฉันเพราะเซิร์ฟเวอร์ของฉันมีเวลาในการทำงาน 378 วัน ฉันลังเลที่จะรีบูตเครื่องเนื่องจากการล้างไฟล์เหล่านั้นในการรีบูตต้องใช้เวลาหลายชั่วโมง
rjmunro

10
ในกรณีของคุณคุณควรให้tmpreaperโอกาส
qbi

1
งาน CRON สามารถแก้ไขได้อย่างง่ายดาย
Ken Sharp

นอกจากนี้tmpwatchควรเป็นเครื่องมือที่เหมาะสม
ArekBulski

1
ดูเหมือนว่า Ubuntu / systemd จะมีทางออกอยู่แล้ว ฉันจะพูดมากกว่านี้ แต่ .... systemd
เคนชาร์ป

65

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

การเปลี่ยน/tmpความถี่การล้างข้อมูล

การตั้งค่าเริ่มต้นที่บอกให้ระบบของคุณล้างข้อมูล/tmpเมื่อรีบูตจะถูกเก็บไว้ใน/etc/default/rcSไฟล์ TMPTIMEค่าที่เราจะดูที่เป็น

มูลค่าปัจจุบันของTMPTIME=0ไฟล์ says says เมื่อรีบูตแม้อายุของไฟล์ การเปลี่ยนค่านี้เป็นหมายเลขอื่น (บวก) จะเปลี่ยนจำนวนวันที่ไฟล์สามารถอยู่รอด/tmpได้

TMPTIME=7

การตั้งค่านี้จะอนุญาตให้ไฟล์อยู่ในนั้น/tmpจนกว่าพวกเขาจะมีอายุหนึ่งสัปดาห์แล้วจึงลบออกในการรีบูตครั้งถัดไป จำนวนลบ ( TMPTIME=-1) บอกให้ระบบไม่ลบสิ่งใด/tmpๆ นี่อาจไม่ใช่สิ่งที่คุณต้องการ แต่มีให้


1
คำอธิบายที่ดี แต่สคริปต์ใดที่เป็นคำสั่ง cleanup? ฉันเคยเห็น/etc/init/mounted-temp.confแต่มีเส้นstart on mounted MOUNTPOINT=/tmpที่ทำให้ฉันคิดว่ามันใช้ไม่ได้
enzotib

7
หากคุณไม่ต้องการไฟล์ที่จะถูกลบโดยอัตโนมัติใส่ไว้ในแทน/var/tmp /tmp
Gilles

1
นอกจากนี้ยังมีประโยชน์ในการเก็บไฟล์ที่คุณไม่ต้องการสูญเสีย (เฟรมวิดีโอที่แสดงผล) เมื่อเครื่องของคุณเกิดปัญหาอาจเป็นเพราะ OOM ทางออกที่ดีกว่าคือการแก้ไขปัญหาแน่นอน :-)
Ken Sharp

สามารถทำได้ภายใน Cygwin หรือไม่
CMCDragonkai

46

ฉันกำลังตรวจสอบเรื่องนี้บน Ubuntu 16.10 ฉันสามารถรับรองได้ว่าการแก้ไข / etc / default / rcS จะไม่มีผลกระทบใด ๆ อีกต่อไปและไฟล์ใน tmp จะถูกลบออกโดยการรีบูตไม่ว่าคุณจะใส่อะไรในไฟล์นั้น อย่างที่คนอื่นพูดถึง tmpreaper จะไม่ถูกใช้อีกต่อไป

ฉันคิดว่าคำตอบที่ถูกต้องคือ Ubuntu 16.10 มีการตั้งค่าใหม่ มีโฟลเดอร์ /etc/tmpfiles.d อยู่ใน man page "tmpfiles.d" ในโฟลเดอร์นั้นควรวางไฟล์กำหนดค่าเพื่อควบคุมว่าจะลบไฟล์ / tmp หรือไม่ นี่คือสิ่งที่ฉันกำลังทำเพื่อหยุดการรีบูตจากการลบไฟล์ใน / tmp เว้นแต่พวกเขามีอายุ 20 วัน:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

แทนที่ "20d" โดย "-" หากคุณไม่ต้องการลบไฟล์ นี่คือความพยายามที่ดีที่สุดของฉันหน้าคนนั้นแทบจะไม่ยอมรับรายละเอียดเลย

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


5
man tmpfiles.d
Martin Schröder

ฉันพบว่าคุณสามารถสงวนสิทธิ์การใช้ไฟล์ดั้งเดิมและเจ้าของโดยใช้เครื่องหมายขีดคั่น:d /tmp/ - - - 20d
Dave Yarwood

2
นอกจากนี้ยังมีข้อควรจำ: คุณสามารถทดสอบการกำหนดค่าของคุณได้โดยการเรียกใช้งานการทำความสะอาดด้วยตนเอง:systemctl start systemd-tmpfiles-clean
Dave Yarwood

@ pauljohn32 นี้เป็นจริงสำหรับรุ่นหลังจาก 16.10
kapad

3
@kapad: ฉันเพิ่งตรวจสอบว่ามันทำงานบน Ubuntu 18.04 เช่นกัน
Gene Vincent

26

ใน Ubuntu 14.04 ทำได้โดยการtmpreaperเรียก cron (จาก/etc/cron.daily) ทุกวัน โปรแกรมที่สามารถกำหนดค่าผ่านทางและ/etc/default/rcS/etc/tmpreaper.conf


ในระบบของฉัน tmpreaper ไม่ได้อยู่ใน /etc/cron.daily - แต่ฉันสามารถติดตั้งด้วย apt-get ได้
Joe Germuska

10

ก่อน 14.04:

จะถูกล้างข้อมูลทุกครั้งที่คุณรีบูท


ปรากฏกับ 14.04+ จะใช้ tmpreaper เท่านั้นไม่ใช่สคริปต์ "ต่อการบูต" FWIW
rogerdpack

ระบบ 14.04 ของฉันทั้งหมดล้างข้อมูลในการรีบูต tmpreaperไม่เคยได้ยินแม้แต่ของ
เคนคม

เกิดอะไรขึ้นถ้าคุณไม่รีบูตระบบ?
phuclv

7

ในsystemdUbuntu (15.10 และใหม่กว่า) สิ่งนี้กระทำโดย systemd โดยใช้systemd-tmpfiles-cleanบริการและตัวจับเวลา:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

และ

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

ดังนั้นให้systemd-tmpfiles-cleanปิดเครื่องและหนึ่งครั้งต่อวันเป็นอย่างอื่น ไฟล์ที่มันทำความสะอาดสามารถขยายการใช้/etc/tmpfiles.dที่ระบุไว้ในคำตอบอื่น

คุณสามารถเปลี่ยนพฤติกรรมการจับเวลาได้โดยใช้systemctl edit systemd-tmpfiles-clean.timerและใช้Timerตัวเลือกการกำหนดค่าsystemd ต่างๆ(ดูman 5 systemd.timer)


ฉันเปลี่ยนตัวจับเวลาเป็น 20 นาทีและฉันเห็นว่าคำสั่งสถานะแสดงให้เห็นว่าจริง ๆ แล้วใช้การกำหนดค่า 20 นาที แต่ปัญหาของฉันคือ/tmpยังไม่หมดไป และฉันต้องการมันเพื่อทำความสะอาด แม้การเริ่มด้วยตนเองsudo systemctl start systemd-tmpfiles-cleanจะไม่ทำเคล็ดลับ ความคิดใดทำไม
user2932688

5

บนหนึ่งในเซิร์ฟเวอร์ของเราที่ใช้งาน Ubuntu เรามีสคริปต์เพื่อลบไฟล์ใน / tmp และทำงานทุกคืน

สคริปต์คือ:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

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


6
คุณอาจจะดีกว่าการใช้tmpwatch
poolie

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