In quale cartella devo scrivere per i miei file intermedi, come dev?


17

Sto iniziando a scrivere alcuni script bash per il mio progetto e hanno bisogno di alcuni file intermedi o variabili per essere scritti.

Voglio sapere a quali cartelle posso essere sicuro di avere accesso quando qualcuno esegue il mio script? È una pratica comune da usare /tmp/? O dovrei usare qualcos'altro?

Risposte:



15

Se avete bisogno di scrivere alcuni file temporanei che solo lo scorso finché lo script o l'applicazione è in esecuzione, utilizzare la directory indicata dalla TMPDIRvariabile d'ambiente, o se quella variabile non è definita, /tmp.

/tmpviene cancellato all'avvio su alcuni sistemi (a volte è anche nella RAM, ad esempio per impostazione predefinita su Solaris e su alcune installazioni Linux), quindi non può essere utilizzato per i file che devono sopravvivere a un'interruzione di corrente o al riavvio. /var/tmppuò essere utilizzato per i file che devono sopravvivere al riavvio, ma che possono essere puliti di volta in volta dall'amministratore di sistema. Se l'applicazione deve salvare i file su base permanente, scriverli da qualche parte nella home directory dell'utente (in ~/.programmingnoobsappo ~/.cache/programmingnoobsapp) o sotto /var/lib/programmingnoobsappo /var/cache/programmingnoobsapp.

Si noti che /tmpè condiviso tra tutti gli utenti, quindi è necessario prendere precauzioni quando si crea un file lì. Devi scegliere un nome file che non esiste ancora e devi fare attenzione a non consentire una race condition in cui un altro processo crea il file davanti a te con autorizzazioni diverse, che potrebbe essere una falla di sicurezza (se l'altro processo è in esecuzione come un altro utente, potrebbe quindi accedere e modificare i dati del processo). Utilizzare il mktempcomando per creare un file in /tmpo /var/tmp. Per impostazione predefinita, mktempcrea un file in $TMPDIR, o /tmpse TMPDIRnon è impostato, che di solito è il posto giusto. Se devi utilizzare più file temporanei o anche se ne hai bisogno solo uno, ti consiglio di creare una directory per tutti i tuoi file temporanei conmktemp -d e rimuoverlo alla fine della tua sceneggiatura.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt to mktemp, non rimuovo i file temporanei alla fine del mio script. Ho un lavoro cron di tmpwatch che rimuove automaticamente i vecchi file. Nella stragrande maggioranza dei casi, non leggo il file intermedio e il sistema eliminerà i file da solo. Tuttavia, se qualcosa va storto con lo script, ho tutti i miei file intermedi per un debug semplice.
emory

1
+1 per mktemp. Per me questa è la risposta corretta: delegare l'attività di creazione sicura di un file temporaneo a mktemp(vedere questo articolo ). Anche se l'unica risposta che cita FHSha anche un grande valore.
Carlos Campderrós,

Perché si inizializza tmp_rootprima di assegnarlo? Non sarebbe più naturale unset?
l0b0

@ l0b0 O funzionerà (tranne sotto set -u, ma non è comune). Deve essere (un) impostato su un valore sicuro prima di impostare la trap, nel caso in cui lo script venga ucciso subito dopo aver impostato la trap.
Gilles 'SO- smetti di essere malvagio' il

Aggiungerei in set -o errexitmodo che se tmp_rootè già impostato in sola lettura nell'ambiente non distruggerà la directory sbagliata ...
l0b0

2

Solo per integrare le risposte che sono già state pubblicate finora.

Esistono anche /dev/shmalcune distribuzioni Linux che possono essere utilizzate per l'archiviazione temporanea. Questa memoria dovrebbe essere usata solo quando le prestazioni dell'I / O dei file sono un fattore critico dato che /dev/shmfa uso del tmpfsfilesystem. Inoltre, dovrebbe essere utilizzato per file e dati di dimensioni ragionevoli. Il tmpfsfilesystem utilizza una RAM di sistema come memoria, quindi non è persistente da un avvio all'altro.

C'è una buona panoramica di tutte le scelte menzionate qui su StackOverflow e anche in questa domanda e risposta intitolata: / tmp vs. / dev / shm per l'archiviazione di file temporanei su Linux? . È trattato bene in questo SuperUser Domande e risposte intitolato: Quando dovrei usare / dev / shm / e quando dovrei usare / tmp? .

Riferimenti


0

Sì, /tmpè principalmente per i file che sono richiesti temporaneamente. Il / tmp ha un bit appiccicoso che significa che solo il proprietario dell'elemento, il proprietario della directory o il superutente può rinominare o eliminare i file. molti programmi lo usano per creare file di blocco e per la memorizzazione temporanea di dati. Su alcune distribuzioni questa directory viene cancellata all'avvio o allo spegnimento.


1
Non tutte le directory / tmp vengono cancellate all'avvio. Ad esempio, le installazioni AIX predefinite no (e questo è UNIX e Linux, non solo Linux).
EightBitTony,

Tuttavia, se è residente "in memoria", che sembra essere predefinito in molti casi, svanisce quando il sistema si arresta per qualsiasi motivo.
mdpc,
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.