Bagaimana direktori / tmp dibersihkan?

301

Bagaimana cara /tmpmembersihkan direktori? Apakah ini otomatis? Jika ya, seberapa sering dibersihkan?

Olivier Lalonde
sumber
15
File sementara saya tidak pernah bisa ditulis ke disk. Mereka ditulis ke disk RAM. Saya memasukkan tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0/ etc / fstab.
Anonim
Terkait: serverfault.com/questions/377348/when-does-tmp-get-cleared/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 六四 事件

Jawaban:

192

Catatan! Jawaban ini sudah usang sejak setidaknya ubuntu 14.04. Lihat jawaban lain untuk situasi saat ini dan jika mereka terbukti benar maka angkatlah mereka dengan marah. Juga posting komentar sehingga saya dapat menaruh tautan di sini ke jawaban yang benar saat ini

Untuk 14,04 lihat https://askubuntu.com/a/759048/1366

Untuk 16.10 lihat https://askubuntu.com/a/857154/453746


Jawaban lama dari 2011:

Pembersihan /tmpdilakukan oleh skrip pemula /etc/init/mounted-tmp.conf. Script dijalankan oleh pemula setiap kali /tmpdipasang. Praktis itu berarti di setiap boot.

Script kira-kira melakukan hal-hal berikut: jika suatu file /tmplebih tua dari $TMPTIMEhari maka akan dihapus.

Nilai default $TMPTIMEadalah 0, yang berarti setiap file dan direktori dalam /tmpdihapus. $TMPTIMEadalah variabel lingkungan yang didefinisikan dalam /etc/default/rcS.

lesmana
sumber
Itu tidak berlaku untuk 14,04 lagi (skrip tidak ada lagi).
Martin Schröder
@ Martin Schröder - skrip ada di sistem saya & ini adalah instalasi bersih 14,04 dan tmpreaper tidak ada!
Lance Holland
Saya menggunakan arch linux sekarang jadi saya tidak bisa memverifikasi. Maaf. Tolong seseorang memverifikasi ini dan komentar atau edit jawaban saya.
lesmana
4
di ubuntu 16.04 tmpreaper ditinggalkan karena tidak aman, silakan lihat: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Tidak. Di Ubuntu 16.04 ia hanya digantikan oleh mekanisme systemd. Baca dokumen itu, dan apa yang akan Anda temukan sebenarnya adalah penjelasan mengapa analisis keamanan yang mengklaim ketidakamanan ini cacat.
JdeBP
141

Direktori dihapus secara default di setiap boot, karena TMPTIME0 secara default.

Di sini Anda dapat mengubah waktu dalam file berikut:

/etc/default/rcS

TMPTIME mengatakan seberapa sering dir tmp bisa dihapus dalam beberapa hari

Max Ruf
sumber
9
Menghapus setiap boot tidak ideal untuk mesin yang tidak pernah reboot, seperti server. Saya memiliki lebih dari 500.000 file yang mengambil ruang 5Gb di / tmp saya karena server saya memiliki uptime 378 hari. Saya enggan untuk mem-boot-ulangnya, hanya karena membersihkan file-file itu saat reboot membutuhkan waktu berjam-jam.
rjmunro
10
Dalam kasus Anda, Anda harus memberi tmpreaperkesempatan.
qbi
1
Pekerjaan CRON dapat dengan mudah menyelesaikannya.
Ken Sharp
Juga tmpwatchharus menjadi alat yang tepat.
ArekBulski
1
Sepertinya Ubuntu / systemd sudah memberikan solusi. Saya akan mengatakan lebih banyak tetapi .... systemd.
Ken Sharp
65

Walaupun /tmpfolder tersebut bukan tempat untuk menyimpan file jangka panjang, kadang-kadang Anda ingin menyimpan beberapa hal lebih lama daripada saat Anda reboot , yang merupakan default pada sistem Ubuntu. Saya tahu satu atau dua kali saya mengunduh sesuatu /tmpselama pengujian, reboot setelah melakukan perubahan dan kemudian kehilangan data asli lagi. Ini dapat diubah jika Anda ingin menyimpan /tmpfile Anda sedikit lebih lama.

Mengubah /tmpFrekuensi Pembersihan

Pengaturan default yang memberitahu sistem Anda untuk menghapus /tmpsaat reboot disimpan dalam /etc/default/rcSfile. Nilai yang akan kita lihat adalah TMPTIME.

Nilai saat ini TMPTIME=0mengatakan hapus file saat reboot meskipun usia file. Mengubah nilai ini ke nomor (positif) yang berbeda akan mengubah jumlah hari file dapat bertahan /tmp.

TMPTIME=7

Pengaturan ini akan memungkinkan file untuk tetap masuk /tmpsampai mereka berumur seminggu, dan kemudian menghapusnya pada reboot berikutnya. Angka negatif ( TMPTIME=-1) memberi tahu sistem untuk tidak pernah menghapus apa pun di /tmp. Ini mungkin bukan sesuatu yang Anda inginkan, tetapi tersedia.

hhlp
sumber
1
penjelasan yang bagus Tapi di mana skrip adalah perintah pembersihan? Saya telah melihat /etc/init/mounted-temp.conf, tetapi memiliki garis start on mounted MOUNTPOINT=/tmpyang membuat saya berpikir itu tidak berlaku.
enzotib
7
Jika Anda tidak ingin file yang akan dihapus secara otomatis, memasukkannya ke dalam /var/tmpbukan /tmp.
Gilles
1
Juga berguna untuk menyimpan file yang tidak ingin Anda hilangkan (membuat bingkai video) saat mesin Anda mogok, mungkin karena OOM. Solusi yang lebih baik tentu saja untuk memperbaiki masalah. :-)
Ken Sharp
Bisakah ini dilakukan di dalam Cygwin?
CMCDragonkai
46

Saya memeriksa ini di Ubuntu 16.10. Saya dapat menyatakan bahwa pengeditan / etc / default / rcS tidak memiliki efek sama sekali dan file dalam tmp dihapus oleh reboot tidak peduli apa yang Anda masukkan ke dalam file itu. Seperti yang disebutkan orang lain, tmpreaper tidak lagi digunakan.

Saya pikir jawaban yang tepat adalah bahwa Ubuntu 16.10 memiliki pengaturan baru. Ada folder /etc/tmpfiles.d, yang didokumentasikan di halaman manual "tmpfiles.d". Dalam folder itu, seseorang harus meletakkan file konfigurasi untuk mengontrol apakah / tmp akan dihapus. Inilah yang saya lakukan untuk menghentikan reboot dari menghapus file di / tmp kecuali mereka berumur 20 hari:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Ganti "20d" dengan "-" jika Anda tidak ingin file dihapus. Ini adalah upaya terbaik saya, halaman manual itu hampir tidak bisa ditembus dengan detail.

Keuntungan dari pengaturan baru adalah bahwa pembersih file masih dapat berjalan bahkan jika sistem tidak di-boot ulang (seperti dalam kasus selalu di server). Itu nilai tambah yang besar, saya pikir.

pauljohn32
sumber
5
man tmpfiles.d
Martin Schröder
Saya menemukan bahwa Anda dapat mempertahankan izin dan pemilik file asli dengan menggunakan tanda hubung:d /tmp/ - - - 20d
Dave Yarwood
2
Juga patut dicatat: Anda dapat menguji konfigurasi Anda dengan menjalankan pekerjaan pembersihan secara manual:systemctl start systemd-tmpfiles-clean
Dave Yarwood
@ pauljohn32 apakah ini juga berlaku untuk versi setelah 16.10?
kapad
3
@kapad: Saya baru saja memverifikasi bahwa ini juga berfungsi pada Ubuntu 18.04.
Gene Vincent
26

Di Ubuntu 14.04 ini dilakukan oleh tmpreaper, yang disebut setiap hari oleh cron (dari /etc/cron.daily). Program ini dapat dikonfigurasi melalui /etc/default/rcSdan /etc/tmpreaper.conf.

Martin Schröder
sumber
pada sistem saya, tmpreaper tidak ada di /etc/cron.daily - tapi saya bisa menginstalnya dengan apt-get
Joe Germuska
10

Sebelum 14,04:

Itu dibersihkan setiap kali Anda reboot.

Utku Demir
sumber
Muncul dengan 14,04+ hanya menggunakan tmpreaper, bukan skrip "per boot" FWIW
rogerdpack
Sistem 14,04 saya semuanya bersih saat reboot. Bahkan tidak pernah mendengarnya tmpreaper.
Ken Sharp
bagaimana jika Anda tidak pernah me-reboot sistem?
phuclv
8

Di systemdUbuntu (15.10 dan yang lebih baru), ini dilakukan oleh systemd, menggunakan systemd-tmpfiles-cleanlayanan dan timer:

$ 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

Dan

$ 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

Jadi systemd-tmpfiles-cleanberjalan pada saat shutdown, dan sekali sehari sebaliknya. File yang dibersihkan dapat diperpanjang menggunakan yang /etc/tmpfiles.ddisebutkan dalam jawaban lain .

Anda dapat mengubah perilaku penghitung waktu itu sendiri menggunakan systemctl edit systemd-tmpfiles-clean.timer, dan menggunakan berbagai Timeropsi konfigurasi systemd (lihat man 5 systemd.timer).

muru
sumber
Saya telah mengubah timer ke 20 menit, dan saya melihat bahwa perintah status menunjukkan bahwa itu sebenarnya menggunakan konfigurasi 20 menit. tapi masalah saya adalah bahwa /tmpmasih belum dibersihkan. dan saya perlu dibersihkan. bahkan mulai manual sudo systemctl start systemd-tmpfiles-cleantidak melakukan trik. Ada ide mengapa?
user2932688
4

Di salah satu server kami yang menjalankan Ubuntu, kami memiliki skrip untuk menghapus file di / tmp dan berjalan setiap malam.

Scriptnya adalah:

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

Cukup simpan konten di atas ke file chmod 775 file dan buat entri cron untuk menjalankannya. Karena ini adalah server web, kami tidak ingin mem-boot ulang untuk alasan yang jelas.

Paul
sumber
6
Anda mungkin lebih baik menggunakan tmpwatch .
poolie
9
Baris terakhir sangat berbahaya. Biasanya, setiap orang dapat berlari ln -s /usr /tmp/kaboomatau bahkan ln -s /* /tmp/...
Daniel Alder