Làm thế nào là thư mục / tmp được dọn sạch?


300

Làm thế nào là /tmpthư mục được làm sạch? Có tự động không? Nếu vậy, bao lâu thì nó được làm sạch?


15
Các tập tin tạm thời của tôi không bao giờ được ghi vào đĩa. Chúng được ghi vào đĩa RAM. Tôi đã đặt tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0/ etc / fstab.
Ẩn danh

Câu trả lời:


192

Ghi chú! Câu trả lời này đã lỗi thời kể từ ít nhất là Ubuntu 14.04. Xem các câu trả lời khác cho tình huống hiện tại và nếu chúng chứng minh đúng thì hãy nâng cấp chúng một cách giận dữ. Cũng gửi bình luận để tôi có thể đặt liên kết ở đây để trả lời đúng hiện tại.

Đối với 14.04, hãy xem https://askubfox.com/a/759048/1366

Để biết 16.10, hãy xem https://askubfox.com/a/857154/453746


Câu trả lời cũ từ năm 2011:

Việc làm sạch /tmpđược thực hiện bởi các kịch bản mới nổi /etc/init/mounted-tmp.conf. Kịch bản được chạy bởi khởi động mọi lúc /tmpđược gắn kết. Thực tế điều đó có nghĩa là tại mỗi lần khởi động.

Kịch bản thực hiện đại khái như sau: nếu một tệp trong /tmpcũ hơn $TMPTIMEngày thì nó sẽ bị xóa.

Giá trị mặc định $TMPTIMElà 0, có nghĩa là mọi tệp và thư mục /tmpbị xóa. $TMPTIMElà một biến môi trường được định nghĩa trong /etc/default/rcS.


Điều đó không còn đúng với 14.04 nữa (kịch bản không còn tồn tại nữa).
Martin Schröder

@Martin Schröder - tập lệnh tồn tại trên hệ thống của tôi và nó là bản cài đặt sạch 14.04 và tmpreaper không tồn tại!
Lance Holland

Tôi đang sử dụng arch linux bây giờ vì vậy tôi không thể xác minh. Lấy làm tiếc. Xin ai đó xác minh điều này và bình luận hoặc chỉnh sửa câu trả lời của tôi.
lesmana

4
trong ubfox 16.04 tmpreaper bị bỏ vì không an toàn, vui lòng xem: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha

1
Không. Trong Ubuntu 16.04, nó chỉ đơn giản được thay thế bởi một cơ chế systemd. Đọc tài liệu đó, và những gì bạn thực sự sẽ tìm thấy là một lời giải thích tại sao phân tích bảo mật tuyên bố sự không an toàn là thiếu sót.
JdeBP

141

Thư mục được xóa theo mặc định tại mỗi lần khởi động, bởi vì TMPTIME0 theo mặc định.

Tại đây bạn có thể thay đổi thời gian trong tệp sau:

/etc/default/rcS

TMPTIME cho biết mức độ thường xuyên của tmp dir sẽ bị xóa trong vài ngày


9
Xóa trong mỗi lần khởi động không lý tưởng cho một máy không bao giờ được khởi động lại, như máy chủ. Tôi đã có hơn 500.000 tệp chiếm dung lượng 5Gb trong / tmp vì máy chủ của tôi có thời gian hoạt động là 378 ngày. Tôi miễn cưỡng khởi động lại nó, đơn giản vì việc xóa các tệp khi khởi động lại mất hàng giờ.
rjmunro

10
Trong trường hợp của bạn, bạn nên cho tmpreapermột cơ hội.
qbi

1
Một công việc CRON có thể dễ dàng giải quyết điều đó.
Ken Sharp

Cũng tmpwatchnên là một công cụ thích hợp.
ArekBulski

1
Có vẻ như Ubuntu / systemd đã cung cấp một giải pháp. Tôi muốn nói nhiều hơn nhưng .... systemd.
Ken Sharp

65

Mặc dù /tmpthư mục không phải là nơi lưu trữ các tệp lâu dài, đôi khi bạn muốn giữ mọi thứ lâu hơn một chút so với lần khởi động lại tiếp theo , đây là mặc định trên các hệ thống Ubuntu. Tôi biết một hoặc hai lần tôi đã tải xuống một cái gì đó /tmptrong quá trình thử nghiệm, khởi động lại sau khi thực hiện thay đổi và sau đó mất dữ liệu gốc. Điều này có thể được thay đổi nếu bạn muốn giữ các /tmptệp của mình lâu hơn một chút.

Thay đổi /tmptần số dọn dẹp

Cài đặt mặc định cho hệ thống của bạn xóa /tmpkhi khởi động lại được giữ trong /etc/default/rcStệp. Giá trị chúng ta sẽ xem xét là TMPTIME.

Giá trị hiện tại của việc TMPTIME=0xóa các tệp khi khởi động lại mặc dù tuổi của tệp. Thay đổi giá trị này thành một số (dương) khác sẽ thay đổi số ngày một tệp có thể tồn tại /tmp.

TMPTIME=7

Cài đặt này sẽ cho phép các tệp ở lại /tmpcho đến khi chúng được một tuần tuổi, và sau đó xóa chúng trong lần khởi động lại tiếp theo. Một số âm ( TMPTIME=-1) cho hệ thống không bao giờ xóa bất cứ thứ gì trong /tmp. Đây có lẽ không phải là thứ bạn muốn, nhưng có sẵn.


1
lời giải thích hay. Nhưng trong kịch bản nào là lệnh dọn dẹp? Tôi đã thấy /etc/init/mounted-temp.conf, nhưng nó có dòng start on mounted MOUNTPOINT=/tmpkhiến tôi nghĩ rằng nó không thể áp dụng được.
enzotib

7
Nếu bạn không muốn xóa tệp tự động, hãy đặt nó vào /var/tmpthay vì /tmp.
Gilles

1
Nó cũng thuận tiện để giữ các tệp bạn không muốn mất (kết xuất khung hình video) khi máy của bạn gặp sự cố, có thể là do OOM. Một giải pháp tốt hơn sẽ là khắc phục vấn đề, tất nhiên. :-)
Ken Sharp

Điều này có thể được thực hiện bên trong Cygwin?
CMCDragonkai

46

Tôi đang kiểm tra điều này trên Ubuntu 16.10. Tôi có thể xác nhận rằng chỉnh sửa / etc / default / rcS không còn hiệu lực nữa và các tệp trong tmp bị xóa sạch bằng cách khởi động lại bất kể bạn đặt gì vào tệp đó. Như những người khác đề cập, tmpreaper không còn được sử dụng.

Tôi nghĩ rằng câu trả lời đúng là Ubuntu 16.10 có thiết lập mới. Có một thư mục /etc/tmpfiles.d, được ghi lại trong trang man "tmpfiles.d". Trong thư mục đó, người ta nên đặt một tệp cấu hình để kiểm soát xem / tmp có bị xóa hay không. Đây là những gì tôi đang làm để ngăn chặn việc khởi động lại xóa các tệp trong / tmp trừ khi chúng được 20 ngày tuổi:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Thay thế "20d" bằng "-" nếu bạn không bao giờ muốn xóa tệp. Đây là nỗ lực tốt nhất của tôi, trang người đàn ông đó gần như không thể xuyên thủng với chi tiết.

Ưu điểm của thiết lập mới là trình dọn dẹp tệp vẫn có thể chạy ngay cả khi hệ thống không được khởi động lại (như trong trường hợp luôn có trên máy chủ). Đó là một điểm cộng lớn, tôi nghĩ vậy.


5
man tmpfiles.d
Martin Schröder

Tôi thấy rằng bạn có thể giữ quyền và chủ sở hữu tệp gốc bằng cách sử dụng dấu gạch nối:d /tmp/ - - - 20d
Dave Yarwood

2
Cũng đáng chú ý: bạn có thể kiểm tra cấu hình của mình bằng cách chạy công việc dọn dẹp thủ công:systemctl start systemd-tmpfiles-clean
Dave Yarwood

@ pauljohn32 điều này cũng đúng với các phiên bản sau 16.10?
kapad

3
@kapad: Tôi vừa xác minh rằng nó cũng hoạt động trên Ubuntu 18.04.
Gene Vincent

26

Trong Ubuntu 14.04, điều này được thực hiện bởi tmpreaper, được gọi là hàng ngày bởi cron (từ /etc/cron.daily). Chương trình có thể được cấu hình thông qua /etc/default/rcS/etc/tmpreaper.conf.


trên hệ thống của tôi, tmpreaper không có trong /etc/cron.d Daily - nhưng tôi đã có thể cài đặt nó với apt-get
Joe Germuska

10

Trước ngày 14.04:

Nó được dọn sạch mỗi khi bạn khởi động lại.


Xuất hiện với 14.04+, nó chỉ sử dụng tmpreaper, không phải là tập lệnh "per boot" FWIW
rogerdpack

Tất cả các hệ thống 14.04 của tôi đều được dọn sạch khi khởi động lại. Thậm chí chưa bao giờ nghe nói về tmpreaper.
Ken Sharp

Nếu bạn không bao giờ khởi động lại hệ thống thì sao?
phuclv

7

Trong systemdUbuntu (15.10 trở lên), điều này được thực hiện bởi systemd, sử dụng systemd-tmpfiles-cleandịch vụ và bộ đếm thời gian:

$ 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

Vì vậy, systemd-tmpfiles-cleanchạy trên tắt máy, và một lần mỗi ngày khác. Các tập tin nó làm sạch có thể được mở rộng bằng cách sử dụng /etc/tmpfiles.dđược đề cập trong câu trả lời khác .

Bạn có thể tự thay đổi hành vi hẹn giờ bằng cách sử dụng systemctl edit systemd-tmpfiles-clean.timervà sử dụng các Timertùy chọn cấu hình systemd khác nhau (xem man 5 systemd.timer).


Tôi đã thay đổi bộ đếm thời gian thành 20 phút và tôi thấy lệnh trạng thái cho thấy rằng nó thực sự đang sử dụng cấu hình 20 phút. nhưng vấn đề của tôi là /tmpvẫn chưa được làm sạch. và tôi cần nó để được làm sạch ngay cả bắt đầu bằng tay sudo systemctl start systemd-tmpfiles-cleancũng không làm được. Bất cứ ý tưởng tại sao?
dùng2932688

5

Trên một trong những máy chủ của chúng tôi chạy Ubuntu, chúng tôi có một tập lệnh để xóa các tệp trong / tmp và nó chạy hàng đêm.

Kịch bản là:

#!/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 {} \;

Chỉ cần lưu các nội dung trên vào một tệp chmod 775 tệp và tạo một mục cron để chạy nó. Vì đây là một máy chủ web, chúng tôi không muốn khởi động lại nó vì những lý do rõ ràng.


6
Bạn có thể tốt hơn khi sử dụng tmpwatch .
poolie

9
Dòng cuối cùng là cực kỳ nguy hiểm. Thông thường, mọi người đều có thể chạy ln -s /usr /tmp/kaboomhoặc thậm chí ln -s /* /tmp/...
Daniel Alder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.