Come posso evitare che una cartella all'interno di / tmp venga ripulita?


12

Questa domanda riguarda Ubuntu 14.10 sul mio laptop sviluppatore.

Ho una cartella /tmpche viene utilizzata da un'applicazione per inserire materiale temporaneo. Questa applicazione di solito crea una cartella temporanea nel mio homedir e la cancella in seguito. Per qualche motivo che non funziona quando homedir è crittografato. Quindi, invece, ho creato un collegamento simbolico /tmp/fooall'interno del mio homedir. La mia applicazione può scrivere lì e crearne una sottocartella temporanea.

Ora /tmp/fooviene eliminato ogni volta che riavvio il mio computer. Fino ad ora ho appena ricreato la cartella manualmente dopo il riavvio. Ora ho imparato in Come viene ripulita la directory / tmp? che c'è un lavoro che lo fa.

Ho osservato /etc/init/mounted-tmp.confma il mio bashfu e soprattutto il mio findfu non sono sufficienti per fare quello che voglio. Ecco un estratto da quel file:

   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

Quello che voglio fare è aggiungere una condizione che lo fa eliminare tutto all'interno /tmp/foo, ma non /tmp/foose stesso. Come lo faccio?


È /tmp/foouna directory o un file?
terdon,

Una directory. Ci sono file all'interno.
simbabque,

Perché non aggiungere mkdir /tmp/foosubito end script?
Hagen von Eitzen,

Cordiali saluti (potresti già saperlo): 14.10 raggiunge EOL a luglio 2015, quindi dovresti davvero aggiornare a Vivid il prima possibile.
Léo Lam,

Risposte:


20

/etc/init/mounted-tmp.conffa parte del mountallpacchetto, pertanto eventuali aggiornamenti su quel pacchetto e le modifiche suggerite verranno ripristinate.

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

Invece, secondo lo standard Filesystem Hierachy (FHS) ;

Per quanto riguarda / tmp :

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

Riguardo a / var / tmp :

La directory / var / tmp è resa disponibile per i programmi che richiedono file o directory temporanei conservati tra i riavvii del sistema. Pertanto, i dati memorizzati in / var / tmp sono più persistenti dei dati in / tmp.

Quindi dovresti cambiare il tuo link simbolico da usare al /var/tmpposto di /tmp.


3
Esempio classico di quando hai un martello, tutto sembra un chiodo.
WernerCD,

@WernerCD potresti elaborare cosa intendi con questo? Stai dicendo che /var/tmpnon è una buona idea?
simbabque,

6
Quando tutto ciò che hai è un martello ... - 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.Sto dicendo che l'OP sta usando / tmp per qualcosa per cui non è destinato a essere usato - Usare / tmp come un martello per il suo problema di mantenere tmp-ma-non-abbastanza roba -tmp. / var / tmp è MEANT da tenere tra i riavvii, quindi è la risposta giusta.
WernerCD,

8

Non è strettamente una risposta alla tua domanda, ma potresti trovare /var/tmpuna posizione più adatta, in quanto non viene ripulita al riavvio. È progettato per file temporanei che non devono essere eliminati automaticamente dopo breve tempo.

Quello che faccio spesso, tuttavia, è creare una cartella in / optare per archiviare cose casuali che non voglio in casa. Questo è un posto adatto per mettere le cose che sono al di fuori del controllo del sistema operativo principale.


Questa è l'idea giusta Se / tmp non fa quello che vuoi, allora memorizza le tue informazioni da qualche altra parte, anche su un'altra unità se c'è spazio disponibile. Non scherzare con cose che Linux (e altri programmatori) si aspettano siano in un certo modo a meno che non sia l'unico modo per ottenere il risultato di cui hai bisogno.
Joe,

6

Così:

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

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

Esempio:

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

Sono d'accordo con l'utente aap: O dovresti occuparti di questo nel software utilizzato ricreando la directory lì se sono file tmp o utilizzare un'altra directory se non sono file tmp che non vengono eliminati.


Questo in realtà non funziona. Mentre il findcomando funziona come previsto quando eseguito manualmente, la directory viene comunque rimossa dopo la modifica /etc/init/mounted-tmp.conf. Sembra che ci sia qualcos'altro che sta succedendo qui.
terdon,

wth. ehm. ciò dovrebbe significare che la 1a riga è difettosa. forse deve essere relativo (?)
Rinzwind,

@terdon sì, sembra che debba essere relativo a / tmp /
Rinzwind il

Non credo, ho provato varie permutazioni, incluso -path ./fooe anche -name '*foo*'e nessuno di loro ha funzionato (su Ubuntu Server 14.04). Penso che non sia il file giusto e stiamo cercando nel posto sbagliato. Quello che stai suggerendo dovrebbe funzionare, semplicemente non sembra.
terdon,

0

È una cattiva idea avere file con valore futuro, scrivere nella directory / tmp (/ var / tmp, come suggerito da altri, è un posto migliore). Detto questo, potresti voler provare a chattr. Questo dovrebbe essere eseguito dopo la chiusura dell'applicazione, ma prima di un arresto. Ricorda che questa operazione non consentirà a nulla di scrivere in quella directory d'ora in poi.

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


Come sarebbe utile se volessi avere una directory temporanea?
simbabque,

-1

Esegui questo:

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

quindi aggiungi questo a / etc / inittab vedi qui: dov'è il file inittab? :

foo:2345:boot:/bin/foodel

Ciò creerà / etc / foo all'avvio se non esiste, e quindi lo svuota.

Questo farà lo stesso con bash login:

echo "/bin/foodel" >> ~/.bashrc

Ubuntu versione 14 non utilizza /etc/inittab. Questo è chiaramente e inequivocabilmente dichiarato nella sua pagina di manuale.
JdeBP,

* facepalm * Mi dispiace @JdeBP, questo è quello che mi succede dopo aver manipolato 4 diverse versioni di Linux. Può mettere il codice da qualche parte dichiarato askubuntu.com/questions/34308/where-is-inittab-file
Daniel
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.