Bagaimana cara mencegah folder di dalam / tmp tidak dibersihkan?

12

Pertanyaan ini tentang Ubuntu 14.10 di laptop pengembang saya.

Saya punya folder /tmpyang digunakan oleh aplikasi untuk meletakkan barang-barang sementara di sana. Aplikasi ini biasanya membuat folder sementara di homedir saya dan menghapusnya sesudahnya. Untuk beberapa alasan itu tidak berfungsi ketika homedir dienkripsi. Jadi sebagai gantinya, saya membuat symlink ke /tmp/foodalam homedir saya. Aplikasi saya dapat menulis di sana dan menjadikannya subfolder sementara.

Sekarang /tmp/foodihapus setiap kali saya reboot mesin saya. Sampai sekarang saya baru saja membuat ulang folder secara manual setelah reboot. Sekarang saya pelajari di Bagaimana direktori / tmp dibersihkan? bahwa ada pekerjaan melakukan itu.

Saya telah melihat /etc/init/mounted-tmp.conftetapi bashfu saya dan terutama findfu saya tidak cukup untuk melakukan apa yang saya inginkan. Berikut kutipan dari file itu:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Yang ingin saya lakukan adalah menambahkan kondisi yang membuatnya menghapus everyting di dalam /tmp/foo, tetapi tidak dengan /tmp/foosendirinya. Bagaimana aku melakukan itu?

simbabque
sumber
Apakah /tmp/foodirektori atau file?
terdon
Direktori Ada file di dalamnya.
simbabque
Mengapa tidak menambahkan yang mkdir /tmp/foobenar sebelumnya end script?
Hagen von Eitzen
Hanya FYI (Anda mungkin sudah tahu ini): 14.10 mencapai EOL pada Juli 2015, jadi Anda harus benar-benar meningkatkan ke Vivid sesegera mungkin.
Léo Lam

Jawaban:

20

/etc/init/mounted-tmp.confadalah bagian dari mountallpaket, sehingga setiap pembaruan pada paket itu dan perubahan yang disarankan akan dikembalikan.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Sebaliknya, menurut standar Filesystem Hierachy (FHS) ;

Mengenai / tmp :

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

Mengenai / var / tmp :

Direktori / var / tmp tersedia untuk program yang memerlukan file atau direktori sementara yang disimpan di antara reboot sistem. Oleh karena itu, data yang disimpan di / var / tmp lebih persisten daripada data di / tmp.

Jadi Anda harus mengubah symbolic link Anda untuk menggunakan /var/tmpbukan /tmp.

Tuan
sumber
3
Contoh klasik ketika Anda memiliki palu, semuanya terlihat seperti paku.
WernerCD
@WernerCD dapat Anda jelaskan apa yang Anda maksud dengan itu? Apakah Anda mengatakan itu /var/tmpbukan ide yang baik?
simbabque
6
Ketika semua yang Anda miliki adalah palu ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Saya mengatakan bahwa OP menggunakan / tmp untuk sesuatu itu tidak dimaksudkan untuk digunakan - Menggunakan / tmp sebagai palu untuk masalahnya menjaga tmp-tapi-tidak-cukup hal -tmp. / var / tmp DIMAKSUDKAN untuk disimpan di antara reboot, jadi itu jawaban yang tepat.
WernerCD
8

Bukan semata-mata jawaban atas pertanyaan Anda, tetapi Anda mungkin menemukan /var/tmplokasi yang lebih cocok, karena tidak dibersihkan saat reboot. Ini dirancang untuk file sementara yang tidak boleh dibuang secara otomatis setelah waktu yang singkat.

Namun, yang sering saya lakukan adalah membuat sendiri folder di bawah / opt untuk menyimpan hal-hal acak yang tidak saya inginkan di rumah. Itu tempat yang cocok untuk meletakkan hal-hal yang berada di luar kendali OS utama.

Andrew Aylett
sumber
Ini ide yang tepat. Jika / tmp tidak melakukan apa yang Anda inginkan, maka simpan info Anda di tempat lain - bahkan di drive lain jika ada ruang yang tersedia. Jangan main-main dengan hal-hal yang diharapkan Linux (dan programmer lain) dengan cara tertentu kecuali itu satu-satunya cara untuk mendapatkan hasil yang Anda butuhkan.
Joe
6

Seperti itu:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Contoh:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Saya setuju dengan pengguna aap: Anda juga harus mengurus ini dalam perangkat lunak yang digunakan dengan membuat kembali direktori di sana jika mereka adalah file tmp atau menggunakan direktori lain jika mereka bukan file tmp yang tidak dibersihkan.

Rinzwind
sumber
Ini sebenarnya tidak berhasil. Sementara findperintah berfungsi seperti yang diharapkan ketika dijalankan secara manual, direktori masih dihapus setelah diedit /etc/init/mounted-tmp.conf. Sepertinya ada hal lain yang terjadi di sini.
terdon
dengan ehm itu berarti baris 1 salah. mungkin itu harus relatif (?)
Rinzwind
@terdon ya sepertinya itu harus relatif ke / tmp /
Rinzwind
Saya tidak berpikir begitu, saya mencoba berbagai permutasi, termasuk -path ./foodan bahkan -name '*foo*'dan tidak ada yang bekerja (pada Ubuntu Server 14.04). Saya pikir itu bukan file yang tepat dan kami mencari di tempat yang salah. Apa yang Anda sarankan seharusnya berhasil, sepertinya tidak.
terdon
0

Merupakan ide yang buruk untuk memiliki file dengan nilai masa depan, menulis ke direktori / tmp (/ var / tmp, seperti yang disarankan oleh orang lain, adalah tempat yang lebih baik). Yang mengatakan, Anda mungkin ingin mencoba chattr. Ini harus dijalankan setelah aplikasi keluar, tetapi sebelum shutdown. Ingatlah bahwa operasi ini tidak akan membiarkan apa pun menulis ke direktori itu untuk selanjutnya.

sentuh /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Melompat Kelinci
sumber
Bagaimana itu berguna jika saya ingin memiliki direktori sementara?
simbabque
-1

Jalankan ini:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

kemudian Tambahkan ini ke / etc / inittab lihat di sini: di mana file inittab? :

foo:2345:boot:/bin/foodel

Itu akan membuat / etc / foo saat boot jika tidak ada, dan kemudian mengosongkannya.

Ini akan melakukan hal yang sama pada login bash:

echo "/bin/foodel" >> ~/.bashrc
Daniel
sumber
Ubuntu versi 14 tidak digunakan /etc/inittab. Ini dinyatakan dengan jelas dan tegas di halaman manualnya.
JdeBP
* facepalm * Maaf @JdeBP, inilah yang terjadi pada saya setelah menyulap 4 versi linux yang berbeda. Dia dapat meletakkan kode di suatu tempat menyatakan askubuntu.com/questions/34308/where-is-inittab-file
Daniel