Chúng tôi có phải xóa thủ công nội dung của / tmp không?


26

Tôi có ấn tượng rằng các tập tin cũ của Wikipedia /tmpsẽ thường xuyên bị xóa. Tuy nhiên, dường như với tôi nó /tmpsẽ chỉ phát triển miễn là nó muốn, và sẽ không có gì bị xóa. Một số người nói tốt hơn là để lại /tmpmột mình và xóa nội dung của nó chỉ khi đĩa đầy.

Câu hỏi của tôi là, có /tmpthực sự được thiết kế để không tự chăm sóc bản thân? Các thực hành tốt nhất là gì?


1
thường /tmpđược làm sạch sau khi khởi động lại, nhưng điều này phụ thuộc vào hệ thống tập tin được gắn ở đó. Nó df -hnói gì
etagenklo

Câu trả lời:


27

Để trả lời các câu hỏi:

  • Được /tmpcho là tự động làm trống:
  • Chúng tôi có phải xóa Tệp /tmpthường xuyên và thủ công không: Không , hệ thống của bạn sẽ chăm sóc chúng.

Nếu bạn có thể tự hỏi:

  • Tôi có thể xóa các tập tin /tmpvì bất kỳ lý do gì (cần không gian, muốn xóa dấu vết, v.v.): Nó phụ thuộc , đọc tiếp .

Hệ thống tập tin tiêu chuẩn cấp bậc (đảm bảo VSATTP) khẳng định :

Thư mục / tmp phải được cung cấp cho các chương trình yêu cầu tệp tạm thời.

Các chương trình không được cho rằng bất kỳ tệp hoặc thư mục nào trong / tmp đều được giữ nguyên giữa các yêu cầu của chương trình.

/var/tmp/có một mục đích tương tự , nhưng không được xóa trong quá trình khởi động lại.

không được đảm bảo rằng /tmp/hoặc /var/tmp/được làm sạch một cách thường xuyên. Điều này có thể phụ thuộc vào phân phối và cài đặt của bạn, mặc dù hầu hết các hệ thống thường thực hiện một số dọn dẹp. Xem bình luận của mike.

Nếu bạn cần xóa một tệp trong / tmp , hãy xem đầu tiên nếu tệp đang được sử dụng. Bạn có thể làm điều này dễ dàng với:

lsof /tmp/file_to_delete

Nếu bạn có quyền làm như vậy, điều này sẽ hiển thị quá trình giữ tay cầm cho tệp đó, như tên quy trình, PID và loại tệp. Để hiển thị thực sự tất cả các quy trình, hãy thêm sudohoặc chạy dưới dạng root người dùng .

lsof +D /tmp

sẽ hiển thị cho bạn tất cả các tệp trong /tmpvà thư mục bên dưới ( +D) hiện đang mở. Tất nhiên bạn không nên xóa các tập tin này.

Trong thực tế khi bạn xóa một tệp vẫn đang mở - nếu bạn có quyền làm như vậy - nó sẽ không thể truy cập được từ không gian tên hệ thống tệp, nhưng nó vẫn tồn tại cho các quy trình có xử lý tệp mở cho nó. Sau khi đóng xử lý đó, tệp không thể truy cập được cho quá trình đó nữa và nếu không có quá trình nào mở tệp nữa thì cuối cùng nó sẽ bị xóa. Một quá trình không nên cho rằng tệp tồn tại giữa các opencuộc gọi tiếp theo , nhưng các lập trình viên rất cẩu thả và bạn không bao giờ biết. Vì lý do đó, không thông minh để xóa các tệp vẫn được sử dụng bởi một số chương trình.


Nói chung đây là tất cả những lời khuyên tuyệt vời, đặc biệt là đoạn cuối cùng. Nhưng việc một hệ thống thực sự dọn sạch / tmp có phụ thuộc vào hệ thống đó hay không. Chẳng hạn, trong openSUSE, không , trừ khi bạn định cấu hình nó thành (từ / etc / sysconfig hoặc thông qua YaST). Ngoài ra, cá nhân của người dùng ~ / tmp (nếu họ có) sẽ không tự động bị xóa.
mike

Vì vậy, vẫn có thể xóa các tập tin mà quá trình đã mở? Và điều này không sụp đổ chương trình? Trường hợp các tập tin tồn tại sau đó? Chương trình vẫn có thể tương tác với tệp "đã mở nhưng đồng thời bị xóa" này chứ? Có cách nào để làm cho rm khó khăn hoặc không thể xóa tệp? Một cái gì đó giống như một tập tin khóa có lẽ?
CMCDragonkai

Tệp là bộ dữ liệu trong hệ thống tệp được truy cập trong không gian tên phân cấp, thông qua đường dẫn và tên tệp. Một tệp có thể có nhiều tên (liên kết cứng) và quá trình có thể có một điều khiển mở cho một tệp. Nếu tệp không thể truy cập, đó là khi nó không có tên và không có xử lý mở, nó sẽ bị xóa. Ngăn chặn xóa là vượt quá chuyên môn của tôi và IMO vượt quá phạm vi của câu hỏi này. Hãy thử tìm kiếm "khóa bắt buộc".
bẫy bẫy

[là một câu trả lời trùng lặp]
bẫy bẫy

4

Tôi nghĩ rằng đây là hệ điều hành phụ thuộc. Tôi tưởng tượng rằng / tmp thường bị xóa khi khởi động lại và thực sự hệ thống sẽ không an toàn để tự dọn dẹp giữa phiên vì nó sẽ không biết tập tin nào đang hoạt động.

Nếu bạn dũng cảm, bạn có thể muốn ném một lệnh vào crontab để xóa các tệp cũ hơn một độ tuổi nhất định, nhưng điều này có thể gây ra một số vấn đề nếu nó xóa các tệp vẫn được sử dụng. Bạn có thể thử một lệnh (tôi chưa thử nó) như

tìm / tmp -type f -ctime +10 -exec rm {} +

Về lý thuyết sẽ xóa tất cả các tệp dưới / tmp cũ hơn 10 ngày.


có lẽ nên thêm -rvào đó
Steven Penny

1
Tuyệt đối KHÔNG thêm -r vào đó - điều đó sẽ có hiệu lực hoặc xóa các tệp ít hơn 10 ngày khi chúng tồn tại trong các thư mục được tạo cách đây hơn 10 ngày. Trong thực tế, lệnh có lẽ nên tìm / tmp -type f -ctime +10 -exec rm {} + để giới hạn tìm kiếm trong các tệp. (Sử dụng lệnh find sẽ lặp lại các thư mục con)
davidgo

1

Các thư mục / tmp và / var / tmp được làm sạch theo lịch trình bình thường. Điều này có thể phụ thuộc vào distro của bạn. Trên hệ thống CentOS của tôi (một bản sao của RedHat), có một công việc định kỳ được lên lịch để chạy tmpwatch , trình dọn dẹp tmp dir, theo lịch trình hàng ngày . Các tệp trong / var / tmp được phép gắn xung quanh lâu hơn một chút so với các tệp trong / tmp /. Tôi cũng đã thấy các tập lệnh prune / tmp (nhưng rõ ràng không phải là / var / tmp) khi khởi động lại, biết rằng không thể có gì giữ tập tin đó mở vì tất cả các quy trình đều mới.

Vì vậy, có, / tmp có bảo trì từ các tập lệnh cơ bản. Nó vẫn có thể lấp đầy bên ngoài những thời gian bảo trì. Nếu bạn chọn làm sạch mọi thứ bằng tay, thực hành sysadmin tốt nhất là cẩn thận. Sysadmin truyền thuyết nói về các liên kết tượng trưng trong / tmp trỏ đến các tệp hệ thống cần thiết đã bị xóa khi n00b sysadmins chạy một findtập lệnh đơn giản .


2
Trên Centos 7 và các hệ thống phiên bản 7+ giống RedHat khác có systemd, việc dọn dẹp được cấu hình trong /usr/lib/tmpfiles.d/tmp.conf. Điều này được gọi bởi systemd-tmpfiles-clean.service của systemd.
người dùng linux shonky

1

Trên CentOS, có một công việc /etc/cron.dailyđược gọi tmpwatchsẽ loại bỏ đệ quy các tệp không được truy cập trong một thời gian nhất định. Thông thường, nó được sử dụng để dọn sạch các thư mục được sử dụng cho không gian lưu trữ tạm thời, chẳng hạn như / tmp.

Đây là /etc/cron.daily/tmpwatchkịch bản

#! / thùng / sh
cờ = -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 "$ flags" 30d / var / tmp
cho d in / var / {cache / man, catman} / {cat ?, X11R6 / cat ?, local / cat?}; làm
    nếu [-d "$ d"]; sau đó
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
làm xong

/tmp nội dung thư mục chỉ bị xóa khi hệ thống khởi động lại, vì quá trình đang chạy có thể có quyền truy cập các tệp từ thư mục đó.


0

Bạn có thể xóa nội dung khỏi /tmp/; nhưng vấn đề với việc này là nếu bạn có một dịch vụ thường xuyên ghi vào /tmp/và bạn xóa các tệp bạn có thể làm cho dịch vụ bị sập hoặc hỏng cho đến khi nó khởi động lại.


0

Các đảm bảo VSATTP xác định /tmpthư mục như "tập tin tạm thời (xem thêm / var / tmp), thường không được bảo quản giữa khởi động lại hệ thống", và /var/tmplà "tập tin tạm thời được lưu giữ giữa khởi động lại".

Ngày nay, với /tmpviệc là một hệ thống tệp RAM (tmpfs) theo mặc định (mặc dù là tùy chọn) trong nhiều bản phân phối GNU / Linux, /tmpthực sự không tồn tại lâu.

(Có thể cho rằng) các ứng dụng nên quản lý các tệp tạm thời của chúng theo đó, theo ý kiến ​​của tôi, bao gồm xóa chúng khi việc sử dụng của chúng kết thúc và không yêu cầu quản trị viên lên lịch xóa có thể phá hủy.


Rất nhiều chương trình có thể thực hiện công việc dọn dẹp các tệp tốt hơn /tmpkhi chúng được thực hiện với chúng hoặc khi chúng thoát, nhưng vẫn tồn tại một vấn đề về các tệp còn lại /tmpsau khi chương trình bị chấm dứt bất thường.
Kevin Fegan

0

Nếu bạn đang chạy Debian (hoặc một công cụ phái sinh như Ubuntu), bạn nên xem tệp / etc / default / rcS của mình và điều chỉnh TMPTIMEbiến môi trường. Theo định nghĩa, những gì nằm trong / tmp không có gì để làm ở đây trong lần khởi động lại tiếp theo.

Tôi đề nghị

  • sử dụng TMPTIMEbiến trên máy chủ
  • mount / tmp dưới dạng tmpfs (trong ram) trên máy tính để bàn (để có thêm tốc độ)

0

Tất nhiên các bản phân phối là khác nhau, nhưng tôi hy vọng các tệp tạm thời sẽ được quản lý tự động bởi hệ thống bên ngoài. Họ có thể sử dụng các công việc định kỳ hoặc dịch vụ dọn dẹp systemd-tmpfiles. Nếu bạn lo lắng về dung lượng ổ đĩa, đây là một lệnh hữu ích để xem dung lượng của mỗi thư mục gốc:

du -hs /* | sort -h

Để xem hệ thống của bạn có đang sử dụng dịch vụ systemd để quản lý các tệp tạm thời hay không, bạn chỉ cần thử:

systemctl status systemd-tmpfiles-clean

Ở phía dưới, bạn sẽ thấy một cái gì đó như sau, cho bạn biết khi nào dịch vụ được chạy lần cuối:

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.

Lưu ý rằng dịch vụ này sẽ thoát ngay khi hoàn thành việc dọn dẹp. Một dịch vụ hẹn giờ có trách nhiệm thường xuyên kích hoạt nó. Bạn có thể kiểm tra nó với:

systemctl status systemd-tmpfiles-clean.timer

Và bạn nên mong đợi một cái gì đó như sau:

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.

Nếu bạn nhìn lại dịch vụ thực tế chịu trách nhiệm làm sạch các tệp, bạn sẽ thấy tất cả những gì nó làm là chạy:

/usr/bin/systemd-tmpfiles --clean

Vì vậy, bạn có thể chạy lệnh đó trực tiếp hoặc thực hiện đúng cách, chỉ cần làm:

systemctl start systemd-tmpfiles-clean

Mà sẽ chạy lệnh thích hợp cho hệ thống của bạn. Tuy nhiên, bạn cần lưu ý rằng đây không phải là lệnh "xóa tất cả các tệp tạm thời ngay bây giờ". Có một số tệp cấu hình kiểm soát những gì thực sự bị xóa và khi nào các ứng dụng có thể định cấu hình các tệp tạm thời của chúng.

Một nơi để tìm cách xử lý chung các tệp tạm thời có /usr/lib/tmpfiles.d/tmp.confthể có các dòng liên quan sau:

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

Bạn có thể thay đổi chúng thành thời gian ngắn hơn, ví dụ, nếu hệ thống của bạn hết dung lượng, chẳng hạn như:

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

Để chắc chắn về những gì bạn đang làm, hãy làm man tmpfiles.dđể đọc hướng dẫn. Một lần nữa, tôi đã tìm thấy cách tiếp cận được trình bày ở đây có liên quan trên CentOS (dựa trên RedHat) và hệ thống Ubuntu, nhưng tôi không biết nhiều về các bản phân phối khác.

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.