Dovremmo eliminare manualmente il contenuto di / tmp?


26

Ho avuto l'impressione che i "vecchi" file /tmpverranno regolarmente eliminati. Tuttavia, mi sembra che /tmpcrescerà solo finché vorrà, e nulla verrà eliminato. Alcune persone dicono che è meglio lasciar /tmpperdere ed eliminare i suoi contenuti solo se il disco si sta riempiendo.

La mia domanda è: è /tmpdavvero progettato per non prendersi cura di se stesso? Quali sono le migliori pratiche?


1
normalmente /tmpviene pulito dopo il riavvio, ma questo dipende dal filesystem montato lì. Cosa df -hdice?
etagenklo,

Risposte:


27

Per rispondere alle domande:

  • È /tmpdovrebbe essere svuotato automaticamente:
  • Dovremmo eliminare i file /tmpregolarmente e manualmente: No , il tuo sistema si prenderà cura di loro.

Se puoi chiederti:

  • Posso eliminare i file /tmpper qualsiasi motivo ( ho bisogno di spazio, voglio rimuovere tracce, ecc.): Dipende , continuate a leggere .

Il file system Hierarchy Standard (FHS) afferma :

La directory / tmp deve essere resa disponibile per i programmi che richiedono file temporanei.

I programmi non devono presumere che i file o le directory in / tmp vengano conservati tra le invocazioni del programma.

/var/tmp/ha uno scopo simile , ma non deve essere eliminato durante il riavvio.

Non è garantito che /tmp/o /var/tmp/vengano ripuliti regolarmente. Ciò può dipendere dalla distribuzione e dalle impostazioni, sebbene la maggior parte dei sistemi esegua periodicamente delle operazioni di pulizia. Vedi commento di mike.

Se è necessario eliminare un file in / tmp , vedere prima se il file è in uso. Puoi farlo facilmente con:

lsof /tmp/file_to_delete

Se hai i diritti per farlo, questo mostrerà il processo che tiene l'handle su quel file, come nome del processo, PID e tipo del file. Per mostrare davvero tutti i processi, anteporre sudoo eseguire come utente root .

lsof +D /tmp

ti mostrerà tutti i file /tmpe le directory sottostanti ( +D) che sono attualmente aperti. Ovviamente non dovresti eliminare questi file.

In effetti, quando si elimina un file che è ancora aperto - se si dispone dei diritti per farlo - diventa inaccessibile dallo spazio dei nomi del file system, ma esiste ancora per i processi che hanno un file aperto gestito per esso. Dopo aver chiuso quell'handle, il file non è più accessibile per quel processo e se nessun processo ha più il file aperto, viene infine eliminato. Un processo non dovrebbe supporre che il file sopravviva tra le openchiamate successive , ma i programmatori sono sciatti e non si sa mai. Per questo motivo non è così intelligente eliminare i file che sono ancora in uso da alcuni programmi.


In generale si tratta di un consiglio eccellente, in particolare l'ultimo paragrafo. Ma se un sistema effettivamente pulisce / tmp dipende da quel sistema. Per esempio, in openSUSE, lo fa non , a meno che non lo si configura per (da / etc / sysconfig, o tramite YaST). Inoltre, il ~ / tmp personale degli utenti (se ne hanno uno) non viene cancellato automaticamente.
mike

Quindi è ancora possibile eliminare i file aperti dai processi? E questo non blocca il programma? Dove esiste il file allora? Il programma può ancora interagire con questo file "aperto ma eliminato contemporaneamente"? C'è un modo per rendere difficile o impossibile per rm rimuovere il file? Qualcosa come un blocco dei file forse?
CMCDragonkai,

I file sono set di dati nel file system resi accessibili in uno spazio dei nomi gerarchico, tramite un percorso e un nome file. Un file può avere più nomi (collegamenti reali) e il processo può avere un handle aperto per un file. Se il file non è accessibile, ovvero quando non ha un nome e un handle aperto, viene eliminato. Prevenire un'eliminazione va oltre la mia competenza e l'IMO oltre la portata di questa domanda. Prova a cercare "blocco mandatario".
trapicki,

[era una risposta duplicata]
trapicki

4

Penso che questo dipenda da vari sistemi operativi. Immagino che / tmp sia in genere cancellato al riavvio, e in effetti non sarebbe sicuro per il sistema ripulirsi a metà sessione poiché non saprà quali file sono attivi.

Se sei coraggioso potresti voler lanciare un comando in crontab che elimina i file più vecchi di una certa età, ma ciò potrebbe causare alcuni problemi se elimina i file ancora utilizzati. Potresti provare un comando (non l'ho provato) come

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

Il che rimuoverà teoricamente tutti i file in / tmp più vecchi di 10 giorni.


probabilmente dovrebbe aggiungere -ra questo
Steven Penny il

1
Assolutamente NON aggiungere -r a quello - ciò avrà l'effetto o la rimozione dei file di meno di 10 giorni in cui esistono nelle directory che sono state create più di 10 giorni fa. In effetti, il comando dovrebbe probabilmente trovare / tmp -type f -ctime +10 -exec rm {} + per limitare la ricerca ai file. (L'utilizzo del comando find farà riferimento a sottodirectory)
davidgo

1

Le directory / tmp e / var / tmp vengono pulite secondo una pianificazione normale. Questo può dipendere dalla tua distribuzione. Sul mio sistema CentOS (un clone di RedHat) c'è un lavoro cron programmato per eseguire tmpwatch , un pulitore di tmp dir, su una pianificazione giornaliera . I file in / var / tmp possono rimanere un po 'più lunghi dei file in / tmp /. Ho anche visto degli script che potano / tmp (ma esplicitamente no / var / tmp) al riavvio, sapendo che non può esserci nulla che tenga aperto quel file poiché tutti i processi sono nuovi.

Quindi, sì, / tmp ha una manutenzione dagli script di base. Può ancora riempirsi al di fuori di questi tempi di manutenzione. Se hai scelto di pulire le cose manualmente, la migliore pratica di amministratore di sistema è quella di fare attenzione. La storia di Sysadmin parla di collegamenti simbolici in / tmp che puntano ai file di sistema necessari che sono stati eliminati quando gli amministratori di sistema n00b eseguivano un semplice findscript.


2
Su Centos 7 e altri sistemi simili a RedHat versione 7+ con systemd, la pulizia è configurata in /usr/lib/tmpfiles.d/tmp.conf. Questo è invocato dal target systemd systemd-tmpfiles-clean.service.
utente Linux shonky il

1

Su CentOS c'è un lavoro /etc/cron.dailychiamato tmpwatchche rimuoverà in modo ricorsivo i file a cui non è stato effettuato l'accesso per un dato tempo. Normalmente, viene utilizzato per ripulire le directory che vengono utilizzate per lo spazio di memorizzazione temporaneo come / tmp.

Questa è la /etc/cron.daily/tmpwatchsceneggiatura

#! / 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
per d in / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; fare
    if [-d "$ d"]; poi
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
fatto

/tmp il contenuto della directory viene eliminato solo al riavvio del sistema, poiché il processo in esecuzione potrebbe avere accesso ai file da quella directory.


0

Puoi rimuovere il contenuto da /tmp/; ma il problema è che se si dispone di un servizio che scrive regolarmente /tmp/e si eliminano i file, è possibile che il servizio si blocchi o si rompa fino al riavvio.


0

Il FHS definisce la /tmpdirectory come "file temporanei (vedi anche / var / tmp), spesso non conservata tra un riavvio del sistema", e /var/tmpcome "file temporanei da conservare tra i riavvii".

Oggi, /tmpessendo un filesystem RAM (tmpfs) per impostazione predefinita (sebbene facoltativo) in molte distribuzioni GNU / Linux, /tmpè effettivamente non persistente.

(Probabilmente) le applicazioni dovrebbero gestire i loro file temporanei di conseguenza, che a mio avviso include la loro eliminazione al termine del loro utilizzo e non richiedere agli amministratori di pianificare possibili eliminazioni distruttive.


Molti programmi potrebbero fare un lavoro molto migliore nel ripulire i file /tmpquando hanno finito con loro o quando escono, ma esiste ancora un problema di file rimasti /tmpdopo una chiusura anomala (crash) di un programma.
Kevin Fegan,

0

Se stai eseguendo Debian (o un derivato come Ubuntu) dovresti guardare il tuo file / etc / default / rcS e regolare la TMPTIMEvariabile d'ambiente. Per definizione, ciò che risiede in / tmp non ha nulla a che fare qui al prossimo riavvio.

io raccomando

  • usando la TMPTIMEvariabile su un server
  • mount / tmp come tmpfs (in ram) su un desktop (per maggiore velocità)

0

Le distribuzioni sono ovviamente diverse, ma mi aspetto che i file temporanei vengano gestiti automaticamente dal sistema. Probabilmente userebbero i lavori cron o il servizio di pulizia systemd-tmpfiles. Se sei preoccupato per lo spazio su disco, questo è un comando utile per dare un'occhiata a quanto spazio occupa ciascuna cartella principale:

du -hs /* | sort -h

Per vedere se il tuo sistema utilizza il servizio systemd per la gestione dei file temporanei, puoi semplicemente provare:

systemctl status systemd-tmpfiles-clean

In fondo vedresti qualcosa di simile al seguente, che ti dice quando è stato eseguito il servizio l'ultima volta:

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.

Si noti che questo servizio verrà chiuso non appena terminato con la pulizia. Un servizio timer è responsabile per l'attivazione regolare. Puoi verificarlo con:

systemctl status systemd-tmpfiles-clean.timer

E dovresti aspettarti qualcosa di simile al seguente:

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.

Se guardi di nuovo al servizio effettivo responsabile della pulizia dei file, vedrai che tutto ciò che viene eseguito viene eseguito:

/usr/bin/systemd-tmpfiles --clean

Quindi potresti eseguire direttamente quel comando, o per farlo correttamente, fai semplicemente:

systemctl start systemd-tmpfiles-clean

Che eseguirà il comando appropriato per il tuo sistema. Tuttavia, dovresti essere consapevole che questo non è un comando "elimina tutti i file temporanei ora". Esistono diversi file di configurazione che controllano ciò che viene effettivamente eliminato e quando le applicazioni possono configurare individualmente i propri file temporanei.

Un posto dove cercare la gestione generica di file temporanei potrebbe essere /usr/lib/tmpfiles.d/tmp.confche potrebbe avere le seguenti righe pertinenti:

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

Potresti cambiarli in un tempo più breve, se il tuo sistema continua a rimanere senza spazio, ad esempio, per:

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

Per essere sicuro di ciò che stai facendo, fai man tmpfiles.dper leggere il manuale. Ancora una volta, ho trovato che l'approccio presentato qui è rilevante su un sistema CentOS (basato su RedHat) e Ubuntu, ma non so molto su altre distribuzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.