Apakah kita seharusnya menghapus konten / tmp secara manual?

26

Saya mendapat kesan bahwa file "lama" di /tmpakan secara teratur dihapus. Namun, menurut saya itu /tmphanya akan tumbuh selama yang diinginkan, dan tidak ada yang akan dihapus. Beberapa orang mengatakan lebih baik membiarkannya /tmpsendiri dan menghapus isinya hanya jika disk sudah penuh.

Pertanyaan saya adalah, apakah /tmpbenar - benar dirancang untuk tidak mengurus dirinya sendiri? Apa praktik terbaik?

IMB
sumber
1
biasanya /tmpdibersihkan setelah reboot, tetapi ini tergantung pada sistem file yang terpasang di sana. Apa yang df -hdikatakan?
etagenklo

Jawaban:

27

Untuk menjawab pertanyaan:

  • Apakah /tmpseharusnya dikosongkan secara otomatis: Ya
  • Apakah kita seharusnya menghapus File /tmpsecara teratur dan manual: Tidak , sistem Anda akan menjaganya.

Jika Anda bertanya pada diri sendiri:

  • Dapatkah saya menghapus file /tmpuntuk alasan apa pun (butuh ruang, ingin menghapus jejak, dll.): Tergantung , baca terus .

Status Sistem Hierarki Standar (FHS) menyatakan :

Direktori / tmp harus tersedia untuk program yang memerlukan file sementara.

Program tidak boleh berasumsi bahwa file atau direktori apa pun di / tmp disimpan di antara pemanggilan program.

/var/tmp/memiliki tujuan yang serupa , tetapi tidak boleh dihapus saat reboot.

Hal ini tidak dijamin bahwa /tmp/atau /var/tmp/dibersihkan secara teratur. Ini mungkin tergantung pada distribusi dan pengaturan Anda, meskipun sebagian besar sistem melakukan pembersihan dari waktu ke waktu. Lihat komentar oleh mike.

Jika Anda perlu menghapus file di / tmp , lihat dulu apakah file tersebut digunakan. Anda dapat melakukannya dengan mudah dengan:

lsof /tmp/file_to_delete

Jika Anda memiliki hak untuk melakukannya, ini akan menunjukkan proses memegang pegangan untuk file itu, seperti nama proses, PID dan jenis file. Untuk benar-benar menunjukkan semua proses, tambahkan sudoatau jalankan sebagai root pengguna .

lsof +D /tmp

akan menampilkan semua file di /tmpdan direktori di bawah ( +D) yang saat ini terbuka. Tentu saja Anda tidak boleh menghapus file-file ini.

Bahkan ketika Anda menghapus file yang masih dibuka - jika Anda memiliki hak untuk melakukannya - itu menjadi tidak dapat diakses dari namespace filesystem, tetapi masih ada untuk proses yang memiliki pegangan file terbuka untuk itu. Setelah menutup pegangan itu, file tidak dapat diakses untuk proses itu lagi, dan jika tidak ada proses membuka file lagi akhirnya dihapus. Suatu proses seharusnya tidak mengira bahwa file bertahan antara openpanggilan berikutnya , tetapi programmer ceroboh, dan Anda tidak pernah tahu. Karena alasan itu, tidak sepandai itu untuk menghapus file yang masih digunakan oleh beberapa program.

trapicki
sumber
Secara umum ini semua saran yang bagus, terutama paragraf terakhir. Tetapi apakah suatu sistem memang membersihkan / tmp tergantung pada sistem itu. Sebagai contoh, di openSUSE, itu tidak , kecuali jika Anda mengkonfigurasinya ke (dari / etc / sysconfig, atau melalui YaST). Juga, ~ ~ tmp pribadi pengguna (jika ada) tidak dihapus secara otomatis.
mike
Jadi masih mungkin untuk menghapus file yang telah dibuka proses? Dan ini tidak merusak program? Di mana file itu ada? Bisakah program masih berinteraksi dengan file "dibuka tetapi dihapus bersamaan" ini? Apakah ada cara untuk membuatnya sulit atau tidak mungkin bagi rm untuk menghapus file? Sesuatu seperti kunci file mungkin?
CMCDragonkai
File adalah kumpulan data dalam sistem file yang dapat diakses dalam namespace hirarkis, melalui jalur dan nama file. File dapat memiliki beberapa nama (tautan keras), dan proses dapat memiliki pegangan terbuka untuk file. Jika file tidak dapat diakses, saat itulah ia tidak memiliki nama dan tidak ada pegangan terbuka, itu dihapus. Mencegah penghapusan adalah di luar keahlian saya dan IMO di luar cakupan pertanyaan ini. Coba cari "penguncian mandatary".
trapicki
[adalah jawaban rangkap]
trapicki
4

Saya rasa ini tergantung pada varian OS. Saya membayangkan bahwa / tmp biasanya dihapus saat reboot, dan memang tidak akan aman bagi sistem untuk membersihkan dirinya sendiri di pertengahan sesi karena tidak akan tahu file apa yang aktif.

Jika Anda berani, Anda mungkin ingin melemparkan perintah ke crontab yang menghapus file lebih tua dari usia tertentu, tetapi ini dapat menyebabkan beberapa masalah jika menghapus file yang masih digunakan. Anda mungkin mencoba perintah (saya belum mencobanya) seperti

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

Yang secara teoritis akan menghapus semua file di bawah / tmp lebih lama dari 10 hari.

davidgo
sumber
mungkin harus menambahkan -ritu
Steven Penny
1
Benar-benar JANGAN menambahkan -r untuk itu - yang akan memiliki efek atau menghapus file yang berumur kurang dari 10 hari di mana mereka ada di direktori yang dibuat lebih dari 10 hari yang lalu. Faktanya, perintah itu mungkin harus mencari / tmp -type f -time +10 -exec rm {} + untuk membatasi pencarian ke file. (Menggunakan perintah find akan
mengulangi
1

Direktori / tmp dan / var / tmp dibersihkan pada jadwal normal. Ini mungkin tergantung pada distro Anda. Pada sistem CentOS saya (klon dari RedHat) ada tugas cron dijadwalkan untuk menjalankan tmpwatch , pembersih tmp dir, pada jadwal harian . File di / var / tmp diizinkan untuk bertahan sedikit lebih lama dari file di / tmp /. Saya juga melihat skrip yang memangkas / tmp (tetapi secara eksplisit tidak / var / tmp) pada reboot, mengetahui bahwa tidak ada yang menahan file itu terbuka karena semua prosesnya baru.

Jadi, ya, / tmp memiliki pemeliharaan dari skrip dasar. Itu masih dapat mengisi di luar waktu perawatan tersebut. Jika Anda memilih untuk membersihkan barang secara manual, praktik sysadmin terbaik adalah berhati-hati. Sysadmin bercerita tentang symlinks di / tmp menunjuk ke file sistem yang diperlukan yang dihapus ketika n00b sysadmin menjalankan findskrip sederhana .

Homolka yang kaya
sumber
2
Pada Centos 7 dan sistem RedHat versi 7+ lainnya seperti systemd, pembersihan dikonfigurasi di /usr/lib/tmpfiles.d/tmp.conf. Ini dipanggil oleh target systemd systemd-tmpfiles-clean.service.
pengguna linux shonky
1

Di CentOS ada pekerjaan yang /etc/cron.dailydisebut tmpwatchyang akan menghapus file secara rekursif yang belum diakses untuk waktu tertentu. Biasanya, ini digunakan untuk membersihkan direktori yang digunakan untuk ruang penyimpanan sementara seperti / tmp.

Ini /etc/cron.daily/tmpwatchskripnya

#! / bin / sh
flags = -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
untuk d di / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; melakukan
    jika [-d ​​"$ d"]; kemudian
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
selesai

/tmp isi direktori bisa dihapus hanya ketika sistem reboot, karena proses yang berjalan mungkin memiliki mengakses file dari direktori itu.

maks
sumber
0

Anda dapat menghapus konten dari /tmp/; tetapi masalah dengan melakukannya adalah jika Anda memiliki layanan yang secara teratur menulis /tmp/dan menghapus file, Anda dapat membuat layanan macet atau rusak hingga dimulai ulang.


sumber
0

The FHS mendefinisikan /tmpdirektori sebagai "file sementara (lihat juga / var / tmp), sering tidak diawetkan antara reboot sistem", dan /var/tmpsebagai "file sementara dipertahankan antara reboot".

Saat ini, dengan /tmpmenjadi sistem file RAM (tmpfs) secara default (meskipun opsional) di banyak distribusi GNU / Linux, /tmpsecara efektif tidak persisten.

(Dapat diperdebatkan) aplikasi harus mengelola file sementara mereka yang sesuai, yang menurut saya, termasuk menghapusnya ketika penggunaannya telah berakhir, dan tidak memerlukan administrator untuk menjadwalkan kemungkinan penghapusan yang merusak.

dawud
sumber
Banyak program bisa melakukan pekerjaan yang jauh lebih baik membersihkan file /tmpketika mereka selesai dengan mereka, atau ketika mereka keluar, tetapi masih ada masalah file yang tersisa /tmpsetelah penghentian (crash) program yang tidak normal.
Kevin Fegan
0

Jika Anda menjalankan Debian (atau turunan seperti Ubuntu), Anda harus melihat file / etc / default / rcS Anda dan sesuaikan TMPTIMEvariabel lingkungan. Menurut definisi apa yang berada di / tmp tidak ada hubungannya di sini pada reboot berikutnya.

saya merekomendasi

  • menggunakan TMPTIMEvariabel di server
  • mount / tmp as tmpfs (in ram) pada desktop (untuk kecepatan lebih)
maxxvw
sumber
0

Distribusi berbeda tentu saja, tetapi saya berharap file sementara dikelola secara otomatis oleh sistem out-of-the-box. Mereka mungkin akan menggunakan pekerjaan cron atau layanan systemd-tmpfiles-clean. Jika Anda khawatir tentang ruang disk, ini adalah perintah yang berguna untuk melihat berapa banyak ruang yang diambil setiap folder root:

du -hs /* | sort -h

Untuk melihat apakah sistem Anda menggunakan layanan systemd untuk mengelola file sementara, Anda bisa mencoba:

systemctl status systemd-tmpfiles-clean

Di bagian bawah Anda akan melihat sesuatu seperti berikut ini, yang memberi tahu Anda ketika layanan terakhir kali dijalankan:

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.

Perhatikan bahwa layanan ini akan keluar segera setelah selesai dengan pembersihan. Layanan pengatur waktu bertanggung jawab untuk memicu secara teratur. Anda dapat memeriksanya dengan:

systemctl status systemd-tmpfiles-clean.timer

Dan Anda harus mengharapkan sesuatu seperti berikut:

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.

Jika Anda melihat lagi pada layanan aktual yang bertanggung jawab untuk membersihkan file, Anda akan melihat bahwa semua itu dijalankan:

/usr/bin/systemd-tmpfiles --clean

Jadi Anda bisa menjalankan perintah itu secara langsung, atau melakukannya dengan benar, cukup lakukan:

systemctl start systemd-tmpfiles-clean

Yang akan menjalankan perintah yang sesuai untuk sistem Anda. Namun, Anda harus sadar bahwa ini bukan perintah "hapus semua file sementara sekarang". Ada beberapa file konfigurasi yang mengontrol apa yang sebenarnya dihapus dan kapan sehingga aplikasi dapat secara individual mengkonfigurasi file sementara mereka.

Satu tempat untuk mencari penanganan generik dari file sementara dapat berupa /usr/lib/tmpfiles.d/tmp.confbaris yang relevan berikut ini:

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

Anda bisa mengubahnya menjadi waktu yang lebih singkat, jika sistem Anda terus kehabisan ruang, misalnya, untuk:

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

Untuk memastikan apa yang Anda lakukan, lakukan man tmpfiles.dmembaca manual. Sekali lagi, saya telah menemukan pendekatan yang disajikan di sini relevan pada CentOS (berbasis RedHat) dan sistem Ubuntu, tetapi saya tidak tahu banyak tentang distribusi lainnya.

Nagev
sumber