Možná budete chtít zkusit něco takového:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find se používá k nalezení souborů, které odpovídají určitým kritériím.
-mtime +7
vybere pouze soubory, které jsou starší než 7 dní (můžete použít jakoukoli jinou hodnotu)-exec fuser -s {} ';'
volá fuser v tichém režimu pro každý soubor, který odpovídá kritériím stáří. fuser vrací 0 (=pravda) pro každý soubor, který byl právě zpřístupněn, a 1 (=nepravda) pro nepřístupné soubory. Protože nás zajímají pouze ty nepřístupné, vložíme-not
před tímto-exec
-exec echo {} ';'
pouze vytiskne všechny názvy souborů odpovídající kritériím. možná budete chtít použít-exec rm {} ';'
místo toho zde, ale protože to může smazat některé stále používané soubory, myslím, že je bezpečnější provést nejprve jednoduchou ozvěnu.- upravit: Možná budete chtít přidat něco jako
-name 'foo*.bar'
nebo-uid 123
omezit účinky čištění na konkrétní vzory souborů nebo ID uživatelů, aby se předešlo náhodným účinkům.
K poslednímu bodu:Zvažte, že mohou existovat soubory, které jsou zapsány pouze jednou (např. při spouštění systému), ale často se čtou (např. jakýkoli X-session-cookie). Proto doporučuji přidat některé kontroly názvů, aby ovlivnily pouze soubory vytvořené vašimi vadnými programy.
edit2: K vaší poslední otázce:Soubor nebude smazán z disku, dokud žádný proces nebude mít otevřený popisovač (alespoň pro nativní linuxové souborové systémy). Problém je v tom, že položka adresáře je okamžitě odstraněna, což znamená, že od okamžiku, kdy soubor odstraníte, již žádné nové procesy soubor nemohou otevřít (protože k němu není připojen žádný název souboru).
Podrobnosti najdete na:https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Ale co kdybych chtěl celý proces automatizovat?
Jak jsem řekl, mohou existovat soubory, které se jednou zapíší a pak jednou za čas čtou (např. soubory cookie relace X, soubory PID atd.). Tyto malé skripty pro odstranění nevyloučí (což je důvod, proč byste mohli chtít provést testovací běh s echo
nejprve před skutečným smazáním souborů).
Jedním ze způsobů, jak implementovat bezpečné řešení, je použít atime
.
atime
ukládá čas posledního přístupu ke každému souboru. Ale tato možnost souborového systému je často zakázána, protože má docela určitý dopad na výkon (podle tohoto blogu někde v oblasti 20-30 %). Je tam relatime
, ale ten zapíše pouze přístupový čas, pokud mtime
se změnil, takže tento nám nepomůže.
Pokud chcete použít atime
, doporučuji mít /tmp
na samostatném oddílu (ideálně ramdisk), aby dopad na výkon na celý systém nebyl příliš velký.
Jednou atime
je povoleno, vše, co musíte udělat, je nahradit -mtime
parametr ve výše uvedeném příkazovém řádku s -atime
.
Možná budete moci odstranit -not -exec fuser -s {} ';'
, ale pro jistotu bych to tam nechal (pro případ, že aplikace udrží soubory otevřené po dlouhou dobu).
Nezapomeňte však, že příkaz otestujete pomocí echo
než skončíte s odstraňováním věcí, které váš systém stále potřebuje!
Neházejte své vlastní.
Debian/Ubuntu má tmpreaper, pravděpodobně je dostupný i v jiných distech.
# tmpreaper - cleans up files in directories based on their age
sudo apt-get install tmpreaper
cat /etc/tmpreaper.conf
Pokud jde o poslední část vaší otázky:
I když si nemyslím, že režim otevírání/vytváření „delete-this-if-i-die“ existuje, proces může bezpečně smazat soubor přímo po jeho vytvoření, pokud má k tomuto souboru otevřenou rukojeť. Jádro si pak ponechá soubor na disku a jakmile skončí poslední proces, který soubor otevřel (ať už kvůli havárii nebo normálně), uvolní se místo obsazené souborem.
Pro obecný způsob, jak vyřešit problém, že některé procesy někdy nevyčistí /tmp, bych navrhl podívat se na jmenné prostory připojení, popsané například zde nebo zde. Pokud je daný proces systémovým démonem, mohl by být zajímavý systemd a jeho nativní funkce umožňující privátní souborové systémy /tmp.